foreach unterbrechen
Florian
- php
0 Auge
1 bobby
0 Felix Riesterer
0 bobby
Hallo,
ich habe gehört dass man eine foreach mit break unterbrechen kann. Dieses habe ich dazu gefunden: http://php.net/manual/de/control-structures.break.php.
Ich verstehe dieses allerdings nicht :/ Ich habe folgende Schleife
foreach($frontend as $array){
echo $array['teaser']
}
Jetzt möchte ich gerne nach jeder zweiten Durchlauf ein Werbeblock einbinden, wie könnte ich dieses umsetzten.
Die Ausgabe würde dann so aussehen
Eintrag 1 Eintrag 2 Werbung Eintrag 3 Eintrag 4 Werbung usw...
Hallo
ich habe gehört dass man eine foreach mit break unterbrechen kann. Dieses habe ich dazu gefunden: http://php.net/manual/de/control-structures.break.php.
Ich verstehe dieses allerdings nicht :/ Ich habe folgende Schleife
foreach($frontend as $array){ echo $array['teaser'] }
Jetzt möchte ich gerne nach jeder zweiten Durchlauf ein Werbeblock einbinden, wie könnte ich dieses umsetzten.
Indem du zählst. Initialisiere, bevor du in die Schleife gehst, eine Variable, die du bei jedem Durchlauf um 1 hochzählst.
$i = 0
foreach($frontend as $array){
echo $array['teaser']
if ($i === 2) {
break;
}
$i++; // inkrementelles Addieren
}
Aber: Dein Ansinnen wird damit nicht funktionieren, weil du mit break
die Schleife endgültig verlässt. Es kannst nur mit Handständen mit dem gegenwärtigen Wert von $i
und einem zweiten Zähler abzählen, wo du vor dem break
warst, um in einem weiteren Durchlauf dort wieder mit der Ausgabe zu beginnen.
Gibst du statt des Arrayelements, welches dran ist, deine Werbung aus, übergehst du das betreffende Element, das gerade dran gewesen wäre. Die Schleife geht ja eins weiter und greift sich das folgende Element des Arrays. Die, statt der Werbung dran gewesen wären, werden also nie ausgegeben.
Sinnvoll ist stattdessen, die Werbung an den passenden Stellen in das Array einzufügen, so dass es beim Schleifendurchlauf dessen natürlicher Bestandteil ist.
Tschö, Auge
Moin,
Gibst du statt des Arrayelements, welches dran ist, deine Werbung aus, übergehst du das betreffende Element, das gerade dran gewesen wäre. Die Schleife geht ja eins weiter und greift sich das folgende Element des Arrays. Die, statt der Werbung dran gewesen wären, werden also nie ausgegeben.
Naja, man kann die Werbung ja zusatzlich zum normalen Element ausgeben. Von daher würde ich das nicht mit in das Array reinpacken.
ich würde das wie folgt lösen
$i=0;
foreach($frontend as $array):
echo $array['teaser'];
if($i%2 === 0)
echo "meine Werbung";
$i++;
endforeach;
Sinnvoll ist stattdessen, die Werbung an den passenden Stellen in das Array einzufügen, so dass es beim Schleifendurchlauf dessen natürlicher Bestandteil ist.
Wenn so, dann mit eigenem Namen und auf Vorhandensein prüfen. Also
$array['advertisment']
in den entsprechenden Datensätzen oder so...
Die müssen dann ja aber trotzdem irgendwo eingefügt werden. Da die Quelle der Daten nicht bekannt ist, wäre die extra bearbeitung, nur um Werbing in das Array zu "knallen" nicht gerade zweckmäßig. Ich finde es besser diese dierekt bei der Ausgabe einzubinden. So kann man auch viel dynamischer bleiben und die Werbung über eine Funktion rotieren.
Gruß Bobby
Hallo
Gibst du statt des Arrayelements, welches dran ist, deine Werbung aus, übergehst du das betreffende Element, das gerade dran gewesen wäre. Die Schleife geht ja eins weiter und greift sich das folgende Element des Arrays. Die, statt der Werbung dran gewesen wären, werden also nie ausgegeben.
Naja, man kann die Werbung ja zusatzlich zum normalen Element ausgeben. Von daher würde ich das nicht mit in das Array reinpacken.
Ja, das geht natürlich auch.
ich würde das wie folgt lösen
$i=0; foreach($frontend as $array): echo $array['teaser']; if($i%2 === 0) echo "meine Werbung"; $i++; endforeach;
Sinnvoll ist stattdessen, die Werbung an den passenden Stellen in das Array einzufügen, so dass es beim Schleifendurchlauf dessen natürlicher Bestandteil ist.
…
Die müssen dann ja aber trotzdem irgendwo eingefügt werden.
Ja natürlich.
Da die Quelle der Daten nicht bekannt ist, wäre die extra bearbeitung, nur um Werbing in das Array zu "knallen" nicht gerade zweckmäßig. Ich finde es besser diese dierekt bei der Ausgabe einzubinden. So kann man auch viel dynamischer bleiben und die Werbung über eine Funktion rotieren.
?
Der Unterschied zwischen Array durchlaufen und dabei prüfen, ob zusätzlich zum Arrayelement Werbung angezeigt werden soll und Werbung an den passenden Stellen in das Array einfügen und das Array zur Generierung der Anzeige zu durchlaufen ist welcher? Dynamisch kann ich mit beiden Lösungen sein und die Quelle des Arrays spielt in beiden Fällen während der Be- und Verarbeitung keine Rolle.
Tschö, Auge
Hallo,
ich würde das wie folgt lösen
$i=0; foreach($frontend as $array): echo $array['teaser']; if($i%2 === 0) echo "meine Werbung"; $i++; endforeach;
wenn ich dieses so umsetzte, erhalte ich leider eine falsche Ausgabe. Diese sieht jetzt folgendermaßen aus
Eintrag 1 Werbung Eintrag 2 Eintrag 3 Eintrag 4 Werbung Eintrag 5 Eintrag 6
Hey,
$i=0; foreach($frontend as $array): echo $array['teaser']; if($i%2 === 0) echo "meine Werbung"; $i++; endforeach;
wenn ich dieses so umsetzte, erhalte ich leider eine falsche Ausgabe.
Tja, dann würde ich dir vorschlagen, mit $i = 1 zu starten...
Oder du imkrementierst schon in der Selektion, dann sparst du dir die eine Zeile am Ende... Ist dir überlassen.
Reinhard
Hallo,
Tja, dann würde ich dir vorschlagen, mit $i = 1 zu starten...
danke dir, so klappt es. Jetzt hätte ich noch eine Frage, ist es auch möglich zu sagen ich möchte die Werbung nur zweimal einblenden, sprich nach den ersten beiden und nach den 4
Eintrag 1 Eintrag 2 Werbung Eintrag 3 Eintrag 4 Werbung Eintrag 5 Eintrag 6 Eintrag 7 usw....
Ich sehe gerade es ist einfach zu viel Werbung sonst :/
Hey,
danke dir, so klappt es. Jetzt hätte ich noch eine Frage, ist es auch möglich zu sagen ich möchte die Werbung nur zweimal einblenden, sprich nach den ersten beiden und nach den 4
Eintrag 1 Eintrag 2 Werbung Eintrag 3 Eintrag 4 Werbung Eintrag 5 Eintrag 6 Eintrag 7 usw....
Übersteigt das wirklich deine Kompetenz?
if ($i % 2 == 0 && i < 5)
// gib mir mehr werbung...
Reinhard
Hallo Reinhard,
danke dir, so klappt es. Jetzt hätte ich noch eine Frage, ist es auch möglich zu sagen ich möchte die Werbung nur zweimal einblenden, sprich nach den ersten beiden und nach den 4
Übersteigt das wirklich deine Kompetenz?
if ($i % 2 == 0 && i < 5)
// gib mir mehr werbung...
Das vielleicht. Aber if ($i == 2 or $i == 4)
sollte möglich sein. Das vergessene $
könnte noch zusätzlich verwirren.
Matthias
Hey,
Das vergessene
$
könnte noch zusätzlich verwirren.
Herje... Mit PHP habe ich eigentlich nicht viel am Hut... Kleine Javascript Angewohnheit schätze ich.
Aber Danke!
Reinhard
Hallo,
Übersteigt das wirklich deine Kompetenz?
if ($i % 2 == 0 && i < 5)
// gib mir mehr werbung...
sorry ich bin eigentlich Designer und habe mich noch nie mit PHP beschäftigt :/ Kollege liegt im Krankenhaus und dieser neuer Bereich sollte Pünktlich online gehen, sonst haben wir wieder das Geheule von den Usern.
Das vielleicht. Aber
> if ($i == 2 or $i == 4)
sollte möglich sein. Das vergessene$
könnte noch zusätzlich verwirren.
Danke dir, damit klappt es super. Vielen Dank für eure Hilfe.
Hey,
ich hätte nochmals eine kleine Frage.
<?php
foreach($frontend as $array){
echo $array['teaser'];
if($i == 2 or $i == 4)
echo "Werbung";
$i++;
}
?>
Soweit klappt es auch, ich erhalte wie gewünscht nach dem zweiten und nach dem 4 Eintrag meine Werbung. Allerdings sehe ich natürlich in der zweiten Box genau die gleiche Werbung. Die Werbung kommt ebenfalls aus der Datenbank.
foreach($werbung as $array_werbung){
echo $array_werbung['img'];
}
Benötige ich jetzt innerhalb von if($i == 2 or $i == 4) wieder einen Counter? Dass ich nicht in beiden Boden die gleiche Werbung angezeigt bekomme?
Hat sich erledigt, ich mache es so
if($i == 2 or $i == 2)
und dann ein zweiter Block mit
if($i == 4 or $i == 4)
Hallo
Hat sich erledigt, ich mache es so
if($i == 2 or $i == 2)
und dann ein zweiter Block mit
if($i == 4 or $i == 4)
Programmieren ist wohl nicht dein Ding :)
Ist i jetzt 2 oder etwa 2?
Gruß Jürgen
Hallo,
Programmieren ist wohl nicht dein Ding :)
Absolut nicht :) Wie gestern schon geschrieben liegt mein Kollege der sonst diese Arbeit macht noch mehrere Wochen im Krankenhaus und ich muss diese Unterseite fertig bekommen, sonst meckern die User wieder. Haben kein Verständnis dass jemand verhindert ist.
Ist i jetzt 2 oder etwa 2?
Hmm?
Jetzt verstehe ich, muss so lauten?
if($i == 0 or $i == 2)
if($i == 2 or $i == 4)
Hallo,
Programmieren ist wohl nicht dein Ding :)
Absolut nicht :) Wie gestern schon geschrieben liegt mein Kollege der sonst diese Arbeit macht noch mehrere Wochen im Krankenhaus und ich muss diese Unterseite fertig bekommen, sonst meckern die User wieder. Haben kein Verständnis dass jemand verhindert ist.
Ist i jetzt 2 oder etwa 2?
Hmm?
Jetzt verstehe ich, muss so lauten?
if($i == 2 or $i == 4)
nein. Ich wollte dich nur darauf hinweisen, dass
if($i == 2 or $i == 2)
übersetzt "Ist i jetzt 2 oder etwa 2?" bedeutet.
if($i == 2)
reicht.
Gruß Jürgen
Hallo,
nein. Ich wollte dich nur darauf hinweisen, dass
if($i == 2 or $i == 2)
übersetzt "Ist i jetzt 2 oder etwa 2?" bedeutet.
if($i == 2)
reicht.
danke für den Hinweis.
Hallo,
if($i == 2)
wenn ich dieses so nutzte, habe ich folgende Ausgabe, was totaler quatsch ist :/
Eintrag 1 - Werbung - Eintrag 2 - Werbung - Eintrag 3 - Werbung - Eintrag 4 - Werbung - Eintrag 5 - Werbung - usw....
Hallo,
if($i == 2)
wenn ich dieses so nutzte, habe ich folgende Ausgabe, was totaler quatsch ist :/
Eintrag 1 - Werbung - Eintrag 2 - Werbung - Eintrag 3 - Werbung - Eintrag 4 - Werbung - Eintrag 5 - Werbung - usw....
zeig mal mehr Code.
Gruß Jürgen
Hallo,
zeig mal mehr Code.
<?php
$i=1;
foreach($frontend as $array){
?>
<article>
<div>
<img src="../img/top.png">
</div>
<figure>
<img src="img/<?php echo htmlspecialchars($array['img']);?>" alt="<?php echo htmlspecialchars($array['titel']);?>">
</figure>
<div><?php echo $array['teaser'];?></div>
<span><img src="../img/bottom.jpg"></span>
</article>
<?php if($i == 2)?>
<article>
<div><img src="../img/top-big.png"></div>
<div>
<?php $werbung = werbung($mysqli);
foreach($werbung as $array){ ?>
<img src="../werbung/<?php echo $array['bild'];?>">
<?php } ?>
</div>
<span><img src="../img/bottom-big.jpg"></span>
</article>
<?php $i++;
} ?>
Hallo,
ich bin jetzt nicht der PHP-Experte, aber ich glaube, der if-Block muss in {}:
> <?php
> $i=1;
> foreach($frontend as $array){
> ?>
> <article>
> <div>
> <img src="../img/top.png">
> </div>
> <figure>
> <img src="img/<?php echo htmlspecialchars($array['img']);?>" alt="<?php echo htmlspecialchars($array['titel']);?>">
> </figure>
> <div><?php echo $array['teaser'];?></div>
> <span><img src="../img/bottom.jpg"></span>
> </article>
>
> <?php if($i == 2)?>
{
> <article>
> <div><img src="../img/top-big.png"></div>
> <div>
> <?php $werbung = werbung($mysqli);
> foreach($werbung as $array){ ?>
> <img src="../werbung/<?php echo $array['bild'];?>">
> <?php } ?>
> </div>
> <span><img src="../img/bottom-big.jpg"></span>
> </article>
}
> <?php $i++;
> } ?>
Gruß Jürgen
Hallo,
ok es lag an der {} habe ich hinzugefügt. Die erste Werbung wird angezeigt, der zweite Block leider nicht. Mein Code habe ich so ergänzt
<?php
$i=1;
foreach($frontend as $array){
?>
<article>
<div>
<img src="../img/top.png">
</div>
<figure>
<img src="img/<?php echo htmlspecialchars($array['img']);?>" alt="<?php echo htmlspecialchars($array['titel']);?>">
</figure>
<div><?php echo $array['teaser'];?></div>
<span><img src="../img/bottom.jpg"></span>
</article>
<?php if($i == 2) {?>
<article>
<div><img src="../img/top-big.png"></div>
<div>
<?php $werbung = werbung($mysqli);
foreach($werbung as $array){ ?>
<img src="../werbung/<?php echo $array['bild'];?>">
<?php } ?>
</div>
<span><img src="../img/bottom-big.jpg"></span>
</article>
<?php } $i++; ?>
<?php if($i == 4) {?>
<article>
<div><img src="../img/top-big.png"></div>
<div>
<?php $werbung = werbung($mysqli);
foreach($werbung as $array){ ?>
<img src="../werbung/<?php echo $array['bild'];?>">
<?php } ?>
</div>
<span><img src="../img/bottom-big.jpg"></span>
</article>
<?php } $i++; ?>
<?php } ?>
Hallo,
hab den Fehler gefunden
<?php
$i=1;
foreach($frontend as $array){
?>
<article>
<div>
<img src="../img/top.png">
</div>
<figure>
<img src="img/<?php echo htmlspecialchars($array['img']);?>" alt="<?php echo htmlspecialchars($array['titel']);?>">
</figure>
<div><?php echo $array['teaser'];?></div>
<span><img src="../img/bottom.jpg"></span>
</article>
<?php if($i == 2) {?>
<article>
<div><img src="../img/top-big.png"></div>
<div>
<?php $werbung = werbung($mysqli);
foreach($werbung as $array){ ?>
<img src="../werbung/<?php echo $array['bild'];?>">
<?php } ?>
</div>
<span><img src="../img/bottom-big.jpg"></span>
</article>
<?php } ?>
<?php if($i == 4) {?>
<article>
<div><img src="../img/top-big.png"></div>
<div>
<?php $werbung = werbung($mysqli);
foreach($werbung as $array){ ?>
<img src="../werbung/<?php echo $array['bild'];?>">
<?php } ?>
</div>
<span><img src="../img/bottom-big.jpg"></span>
</article>
<?php } $i++; ?>
<?php } ?>
Das $i++; muss natürlich ganz unten hochgezählt werden.
Hallo
hab den Fehler gefunden
… und ich etwas, das mir unstimmig vorkommt.
Die Blöcke für ($i == 2)
und ($i == 4)
sind in ihrem Aufbau identisch. Auch der Code für das Auslesen und Anzeigen der Werbung ist in beiden Fällen identisch. Beide Blöcke können so, wie es Matthias vorschlug, mit ($i == 2 OR $i == 4)
in einem Block vereinigt werden. Es ist dann innerhalb des Blocks dafür zu sorgen, dass unterschiedliche Werbeeinträge angezeigt werden.
Es ist im Code nichts zu finden, was bestimmt, welche Werbung angezeigt wird. Ich habe dieses Posting von dir jedenfalls so verstanden, dass du nach dem vierten Durchlauf eine andere Werbung anzeigen lassen möchtest, als nach dem zweiten. Soweit ich das sehe, liest du jedesmal alle Werbeeinträge ein und lässt sie alle anzeigen.
Dein Code:
<?php $i=1; foreach($frontend as $array){ ?> <article> <!-- Kram --> </article> <?php if($i == 2) {?> <article> <div><img src="../img/top-big.png"></div> <div> <?php $werbung = werbung($mysqli); foreach($werbung as $array){ ?> <img src="../werbung/<?php echo $array['bild'];?>"> <?php } ?> </div> <span><img src="../img/bottom-big.jpg"></span> </article> <?php } ?> <?php if($i == 4) {?> <article> <div><img src="../img/top-big.png"></div> <div> <?php $werbung = werbung($mysqli); foreach($werbung as $array){ ?> <img src="../werbung/<?php echo $array['bild'];?>"> <?php } ?> </div> <span><img src="../img/bottom-big.jpg"></span> </article> <?php } $i++; ?> <?php } ?>
Tschö, Auge
@@JürgenB
ich bin jetzt nicht der PHP-Experte, aber ich glaube, der if-Block muss in {}:
Das glaube ich nicht. Bei der Ausgabe sollte es überhaupt keine geschweiften Klammern geben, sondern die alternative Schreibweise verwendet werden. Siehe diese Diskussion – Fazit.
Bei der alternativen Schreibweise behält man die Übersicht. Wohin das führt, wenn man sie nicht verwendet, sieht man hier im Thread.
LLAP 🖖
Moin,
ich bin jetzt nicht der PHP-Experte, aber ich glaube, der if-Block muss in {}:
NEIN. Besser ist die Alternativschreibweise (hab ich hier übrigens vom 1. Beispiel an durchgezogen)
if():
elseif():
else:
endif;
while():
endwhile;
for():
endfor;
foreach():
endforeach;
switch():
case :
default:
endswitch;
Mehr dazu hier: http://php.net/manual/de/control-structures.alternative-syntax.php
kombiniert mit einer guter Einrückung, einer guter Kommentierung und einer maximalen Zeilenlänge um 200 Zeichen behält man auch in großen Scripten relativ gut die Übersicht.
Die alternative Schreibweise ist aus meiner Sicht absolut empfehlenswert.
Gruß Bobby
Lieber Florian,
wenn Dein Array numerische Indices hat (also $array[0], $array[1] und so weiter), dann kannst Du die Zählvariable meiner Vorredner so benutzen:
foreach($frontend as $i => $array){
echo $array['teaser']
if (
// $i ungerade?
$i %2 !== 0 // das "!== 0" könnte man hier sogar weglassen
// nicht das letzte Array-Element?
&& $i < count($array) -1
) {
echo $werbung;
}
}
Liebe Grüße,
Felix Riesterer.
Moin,
wenn Dein Array numerische Indices hat (also $array[0], $array[1] und so weiter), dann kannst Du die Zählvariable meiner Vorredner so benutzen:
Du meinst zum einen eher
$frontend[0];
$frontend[1];
foreach($frontend as $i => $array){ echo $array['teaser'] if ( // $i ungerade? $i %2 !== 0 // das "!== 0" könnte man hier sogar weglassen // nicht das letzte Array-Element? && $i < count($array) -1 ) { echo $werbung; } }
Zum anderen wäre es performanter das count() nur 1 mal auszuführen, als in jedem Durchlauf.
$lastIndex=count($frontend)-1;
foreach($frontend AS $i => $array):
echo $array['teaser'];
if($i%2 && $i < $lastIndex)
echo $werbung;
endforeach;
Ansonsten ne gute Idee
Gruß Bobby