foreach nach bestimmter anzahl beenden
Term
- php
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
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
Hi jobo!
Der Ansatz ist richtig.
Ist er nicht...
Richtig wäre folgender Ansatz:
$count = 5;
foreach(...)
{
// ...
if(!(--$count))
break;
}
MfG H☼psel
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
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
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++;
}
?>
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
Hallo
Das geht auch eleganter mit einer for-Schleife
Ich finde while-Schleifen eleganter :-P
tommi
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
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.
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
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
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
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
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!
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
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
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
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?
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.