Term: foreach nach bestimmter anzahl beenden

Hi Leute,

ich hab ein xml file das per foreach ausgelesen wird. Nun möchte ich aber, das die Schleife nach dem 5. Artikel beendet wird.

Soweit bin ich schon:

				<?php  
				$count = 1;  
				$filename = './txt/games.xml';  
				if(file_exists($filename)) {  
				$xml = simplexml_load_file($filename);  
				if($xml) {  
				?>  
				  
					<?php while ($count <= 5) {?>  
					<?php foreach($xml->spiel as $spiel) {?>  
					<br /><p align="center"><img src="image/<?php echo $spiel->datei; ?>" />  
					<br /><br />  
					<?php echo $spiel->name1; ?>  
					<?php echo $spiel->name2; ?>  
					<br />  
					<?php echo $spiel->datum; ?>  
					</p><hr>  
					<?php $count ++; }}?>  
  
				<?php  
				} else {  
				echo '        <p>Die Datei namens '. $filename .' konnte nicht geöffnet werden</p>';  
				}  
				}  
				?>

Vielleicht kann mir ja jemand Helfen.

Grüße Term

  1. Hallo,

    Vielleicht kann mir ja jemand Helfen.

    Wobei denn, was geht denn nicht? Der Ansatz ist richtig. PHPs alternative Syntax könnte das ganze noch etwas schöner aussehen lassen.

    Gruß

    jobo

    1. Hi jobo!

      Der Ansatz ist richtig.

      Ist er nicht...

      Richtig wäre folgender Ansatz:

      $count = 5;  
      foreach(...)  
      {  
        // ...  
        
        if(!(--$count))  
          break;  
      }
      

      MfG H☼psel

      --
      "It's amazing I won. I was running against peace, prosperity, and incumbency."
      George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
      Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      1. Hallo,

        Der Ansatz ist richtig.
        Ist er nicht...

        Richtig wäre folgender Ansatz:

        $count = 5;

        foreach(...)
        {
          // ...

        if(!(--$count))
            break;
        }

        
        >   
          
        Was ist an der Runterzählerei richtiger? Abgesehen davon, dass die while-Schleife nicht nötig ist.  
          
        Gruß  
          
        jobo
        
        1. Hi jobo!

          Was ist an der Runterzählerei richtiger? Abgesehen davon, dass die while-Schleife nicht nötig ist.

          Die while-Schleife ist einfach falsch:

          $count = 1;  
          while ($count <= 5)  
          {  
            foreach(...)  
            {  
              // ...  
              $count ++;  
            }  
          }
          

          Wenn $count (wieder) überprüft wird, ist foreach schon längst fertig mit seiner Arbeit.
          Wie soll die äußere while-Schleife also ihre Bedingung überprüfen, wenn sie die Kontrolle erst erhält, wenn die Kontrolle schon längst passiert sein sollte (nämlich mit jedem Durchlauf von foreach).

          MfG H☼psel

          --
          "It's amazing I won. I was running against peace, prosperity, and incumbency."
          George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
          Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  2. Ungefähr so:

    <?php
    $array=$xml->spiel;
    while($count < 5)
    {
     ?>

    <img src="image/<?=$array[$count]->datei;?>" />
     <br /><br />

    <?=$array[$count]->name1; ?>
     <?=$array[$count]->name2; ?>

    <br />

    <?=$array[$count]->datum; ?>

    </p><hr>

    <?php
     $count++;
    }
    ?>

    1. Moin

      Ungefähr so:

      <?php
      $array=$xml->spiel;
      while($count < 5)
      {
      ?>

      <img src="image/<?=$array[$count]->datei;?>" />
      <br /><br />

      <?=$array[$count]->name1; ?>
      <?=$array[$count]->name2; ?>

      <br />

      <?=$array[$count]->datum; ?>

      </p><hr>

      <?php
      $count++;
      }
      ?>

      Das geht auch eleganter mit einer for-Schleife

        
      for ($count=1;$count<=5;$count++)  
      {  
        ... hier dir Ausgabe  
      }  
      
      

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      ### Henry L. Mencken ###
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ## Viktor Frankl ###
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      1. Hallo

        Das geht auch eleganter mit einer for-Schleife

        Ich finde while-Schleifen eleganter :-P

        tommi

        1. Moin

          Ich finde while-Schleifen eleganter :-P

          Warum? Die Bedingung und die Zählvariable sind in For-Schleifen elegant integriert. Viel besser zu überblicken als in While-Schleifen.

          Gruß Bobby

          --
          -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
          ### Henry L. Mencken ###
          -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
          ## Viktor Frankl ###
          ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  3. Ergänzend zu den anderen Antworten, warum nimmst du hier überhaupt foreach?
    Man kann natürlich natürlich schon aus foreach aussteigen, aber wenn schon eine fest definierte Anzahl gewünscht ist, würd ich das nicht verwenden.
    Der Grund für mich wäre, dass ich foreach wie der Name schon sagt "für alle" Elemente einsetze, was hier ja nicht der Fall ist.

  4. Das geht ja Fix bei euch.

    Hab den Code jetzt folgend geändert:

    				<?php  
    				$count = 0;  
    				$filename = './txt/games.xml';  
    				if(file_exists($filename)) {  
    				$xml = simplexml_load_file($filename);  
    				if($xml) {  
      
    				$array=$xml->spiel;  
    				while($count < 5)  
    				{  
    				?>  
      
    				<p align="center"><br /><img src="image/<?=$array[$count]->datei;?>" />  
    				<br /><br />  
      
    				<?=$array[$count]->name1; ?>  
    				<?=$array[$count]->name2; ?>  
      
    				<br />  
      
    				<?=$array[$count]->datum; ?>  
      
    				</p><hr>  
      
    				<?php $count++; }}}?>
    

    So funktionierts auch wunderbar (ist wahrscheinlich nicht die schönste Lösung aber geht).

    Nochmal Danke an alle für die schnellen Lösungen. Super Forum.

    Grüße Term

    1. Gerne geschehen.

      Du kannst deinen XML-Code hier übrigens auch als XML highlighten lassen. Und IN dem XML-Block kannst du auch PHP einfügen:

      http://forum.de.selfhtml.org/hilfe/bedienung.htm#syntax-highlighting

      Lg
      tommi

    2. Hi,

      Hab den Code jetzt folgend geändert:

        		$array=$xml->spiel;  
        		while($count < 5)  
      
        		<?=$array[$count]->name1; ?>  
      

      Wenn du die Elemente jetzt sowieso über einen nummerischen Index ansprichst - wieso nimmst du dann nicht gleich eine for-Schleife?

      MfG ChrisB

      --
      Light travels faster than sound - that's why most people appear bright until you hear them speak.
      1. Moin

        Wenn du die Elemente jetzt sowieso über einen nummerischen Index ansprichst - wieso nimmst du dann nicht gleich eine for-Schleife?

        Das hatte ich auch schon vorgeschlagen. For-Schleifen sind übrigens schwerfälliger als While- und While-do-Schleifen... :D Siehe hier

        Aber die For-Schleife würde hier einfach besser aussehen. Da gebe ich dir Recht

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
        ### Henry L. Mencken ###
        -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
        ## Viktor Frankl ###
        ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
        1. Hi!

          For-Schleifen sind übrigens schwerfälliger als While- und While-do-Schleifen... :D Siehe hier

          Mag ja sein, dass dieser Vergleich das ergeben hat, aber die Differenz bei sage und schreibe 5 Durchläufen geht komplett im Grundrauschen unter. Die meisten dieser Benchmarks haben für die Praxis selten relevante Auswirkungen.

          Lo!

          1. Moin

            Mag ja sein, dass dieser Vergleich das ergeben hat, aber die Differenz bei sage und schreibe 5 Durchläufen geht komplett im Grundrauschen unter. Die meisten dieser Benchmarks haben für die Praxis selten relevante Auswirkungen.

            Deshalb sagte ich ja, das es für diesen Fall die beste Lösung ist eine For-Schleife anzuwenden. Das andere war nur nebenbei-Info. :D

            Gruß Bobby

            --
            -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
            ### Henry L. Mencken ###
            -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
            ## Viktor Frankl ###
            ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
        2. Hi,

          For-Schleifen sind übrigens schwerfälliger als While- und While-do-Schleifen... :D Siehe hier

          Zitat:

          Die For-Schleife ist auch kopfgesteuert, sie ist jedoch wesentlich komplexer als die While-Schleifen. Der Schleifenkopf benötigt drei Ausdrücke: Initialisierung des Iterators (bei Schleifenbeginn), Bedingung(en) (vor jedem Durchlauf) und ein Anweisungsfeld (in der Regel für Iterationserhöhung, welche am Ende eines Durchlaufs ausgeführt wird).

          Das allein taugt als Argument in so einem Falle m.E. gar nichts.

          Auch bei der While-Schleife, so wie sie im vorliegenden Falle genutzt wird, muss der Zähler erst mal initialisiert werden, und irgendwo im Anweisungsblock auch erhöht werden. Die gleichen Operationen - nur bei der For-Schleife schön zentral an einer überschaubaren Stelle; bei der While-Schleife hingegen irgendwo verstreut.

          Die For-Schleife landet bei diesem Test auf Grund ihrer Komplexität wie erwartet auf dem letzten Platz; am schnellsten schafft die do..while Schleife die 100.000 Schleifendurchläufe, da diese die Abbruchbedingungen erst am Ende eines Duchlaufs überprüft und somit keine Sprünge in der Maschinensprache braucht.

          Dazu, wie sinnvoll solche Arten von "Performance-Messung" sind bzw. wie praxisrelevant, hat sich dedlfix letztens schon mal sehr treffend geäussert (vorletzter Absatz).

          Aber die For-Schleife würde hier einfach besser aussehen. Da gebe ich dir Recht

          Und sie nach diesem Kriterium zu wählen, erscheint mir bei PHP alle Mal sinnvoller, als nach irgendwelchen Performance-Überlegungen.

          MfG ChrisB

          --
          Light travels faster than sound - that's why most people appear bright until you hear them speak.
          1. Moin

            Aber die For-Schleife würde hier einfach besser aussehen. Da gebe ich dir Recht

            Und sie nach diesem Kriterium zu wählen, erscheint mir bei PHP alle Mal sinnvoller, als nach irgendwelchen Performance-Überlegungen.

            Deshalb wäre das die Schleife meiner Wahl, wie ich dies schon bemerkte. Das andere war nur Beiwerk. Einfach als Zusatzinfo. :D

            Gruß Bobby

            --
            -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
            ### Henry L. Mencken ###
            -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
            ## Viktor Frankl ###
            ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
          2. Zitat:

            Die For-Schleife ist auch kopfgesteuert, sie ist jedoch wesentlich komplexer als die While-Schleifen...

            Ich sehe das auch als völligen Schwachsinn an.

            Gibts dazu irgendwelche Belege, zum Beispiel in Form von Assemblercode?

    3. So funktionierts auch wunderbar (ist wahrscheinlich nicht die schönste Lösung aber geht).

      Dann mach sie noch ein bisschen schöner.
      Du könntest zum Beispiel php und html etwas voneinander trennen, ohne dauernd die spitzen Klammern zu verwenden. Das liest sich ziemlich schwer.