Lektion 2.3: Schleifen mit foreach
Die meisten Seiten zeigen Listen: die Artikel eines Ordners, die Einträge eines Menüs, die Bilder einer Galerie.
{foreach} ist die Schleife der Template-Sprache. In dieser Lektion durchlaufen die Teilnehmenden Arrays, Hashes und
die Kinder eines Knotens und verwenden die Teile von foreach, die zusätzlichen Code sparen: Trennzeichen, Sequenzen,
Offset und Maximum.
Auf einen Blick
| Kurs | Entwickler |
| Modul | Modul 2: Die Template-Sprache |
| Dauer | 45 Minuten (15 Präsentation, 30 Übung) |
| Niveau | Einsteiger |
| Zielgruppe | Entwickler und Template-Bauer |
| Voraussetzungen | Lektion 2.2 |
Lernziele
Nach dieser Lektion können die Teilnehmenden:
- mit
{foreach $list as $item}und{foreach $hash as $key => $value}ein Array oder einen Hash durchlaufen; - mit
{delimiter}Trennzeichen zwischen die Elemente setzen; - mit
sequence ... as $classCSS-Klassen abwechseln; - eine Schleife mit
offset,maxundreversebegrenzen und umordnen; - mit
{break},{continue}und{skip}eine Schleife verlassen oder Elemente überspringen und mit|countzählen.
Hinweise für Trainer
So präsentieren Sie es
Quelle: der Syntaxkommentar in lib/eztemplate/classes/eztemplateforeachfunction.php:
{foreach <array> as [$keyVar =>] $itemVar
[sequence <array> as $sequenceVar]
[offset <offset>]
[max <max>]
[reverse]}
[delimiter.../delimiter]
[break] [continue] [skip]
/foreach- Die einfache Schleife (3 Minuten).
{foreach $list as $item}{$item}{/foreach}. Zeigen Sie sie über ein Array und über$node.children, ein Attribut des Knotens, das seine Kindknoten zurückgibt. - Schlüssel (2 Minuten).
{foreach $hash as $key => $value}liefert auch den Schlüssel; bei einem Array ist der Schlüssel der Index, gezählt ab 0. - Trennzeichen (2 Minuten).
{delimiter}, {/delimiter}wird zwischen den Elementen ausgegeben, nie nach dem letzten. - Sequenz (3 Minuten).
sequence array( 'odd', 'even' ) as $classdurchläuft die Werte im Kreis, für Zeilen im Zebramuster. - Offset, max, reverse (3 Minuten). Die ersten Elemente überspringen, nach einer Anzahl aufhören, rückwärts gehen.
- Vorzeitig verlassen (2 Minuten).
{break}beendet die Schleife,{continue}und{skip}gehen zum nächsten Element.
Häufige Fragen
Sollte ich bei einem großen Ordner über $node.children laufen? Nein. Das lädt jedes Kind. Für echte Listen
verwenden Sie fetch( 'content', 'list', ... ) mit einem limit (Modul 5); $node.children ist für wenige Elemente
in Ordnung.
Gibt es einen Zähler? Verwenden Sie den Schlüssel einer Array-Schleife oder {set $i = $i|inc} in der Schleife mit
einer vorher deklarierten Variablen.
Was ist mit {section}? Das ist die ältere Schleife, die noch in alten Templates zu finden ist. Schreiben Sie neue
Templates mit foreach.
Stolperfallen
- wash in Schleifen. Jeder ausgegebene Name braucht weiterhin
|wash. defin einer Schleife. Ein{def}in der Schleife läuft bei jedem Element und warnt ab dem zweiten Mal. Deklarieren Sie vor der Schleife, verwenden Siesetdarin.- Große Schleifen in der Spielwiese. Halten Sie bei einem großen Ordner
maxklein, damit die Ausgabe lesbar bleibt.
Praktische Übung
Verwenden Sie die Spielwiese aus Lektion 2.1 (extension/mysite_hello/scripts/play.tpl) und führen Sie nach jedem
Schritt php bin/php/ezexec.php extension/mysite_hello/scripts/play.php aus.
Durchlaufen Sie ein Array mit seinen Schlüsseln und einem Trennzeichen:
def $colors = array( 'red', 'green', 'blue' ) foreach $colors as $i => $color$i:$colordelimiter, /delimiter/foreachFügen Sie abwechselnde Klassen hinzu:
<ul> foreach $colors as $color sequence array( 'odd', 'even' ) as $class <li class="$class">$color|wash</li> /foreach </ul>Zeigen Sie nur das zweite und dritte Element:
{foreach $colors as $c max 2 offset 1}{$c} {/foreach}.Zeigen Sie sie rückwärts:
{foreach $colors as $c reverse}{$c} {/foreach}.Zählen Sie sie:
{$colors|count} colors.Durchlaufen Sie die Kinder des Knotens, höchstens fünf:
<ul> foreach $node.children as $child max 5 <li>$child.name|wash ($child.class_identifier)</li> /foreach </ul>Überspringen Sie versteckte Kinder: Fügen Sie
{if $child.is_hidden}{continue}{/if}als erste Zeile in der Schleife hinzu.Durchlaufen Sie einen Hash:
{foreach hash( 'a', 1, 'b', 2 ) as $key => $value}{$key}={$value} {/foreach}.Geben Sie die Variablen am Ende mit
{undef $colors}frei und committen Sie das Template.
Erwartetes Ergebnis
- Schritt 1 gibt
0:red, 1:green, 2:blueaus. - Schritt 2 gibt drei Elemente
<li>mit den Klassenodd,even,oddaus. - Schritt 3 gibt
green blueaus; Schritt 4blue green red; Schritt 53 colors. - Schritt 6 gibt die Namen und Klassenbezeichner von bis zu fünf Kindern von Knoten 2 aus.
- Schritt 8 gibt
a=1 b=2aus. - Der Trainer vergleicht die Ausgabe von Schritt 6 mit dem Inhaltsbaum in der Administration.
Quiz
- Wie geben Sie
,zwischen den Elementen aus, aber nicht nach dem letzten? - Welcher Teil von
foreachwechselt CSS-Klassen ab? A.delimiterB.sequenceC.offsetD.reverse - Was gibt
{foreach $list as $c max 2 offset 1}fürarray( 'a', 'b', 'c', 'd' )aus? - Warum ist
$node.childrenfür einen Ordner mit Tausenden von Elementen eine schlechte Wahl? - Was ist der Unterschied zwischen
{break}und{continue}?
Antworten
- Mit
{delimiter}, {/delimiter}in der Schleife. - B.
sequence array( 'odd', 'even' ) as $class. bundc: eines überspringen, dann zwei nehmen.- Es lädt jedes Kind; ein
fetchmit einemlimitlädt eine Seite (Modul 5). {break}beendet die Schleife;{continue}macht mit dem nächsten Element weiter.
Weiterführende Literatur
- Templates und Design, Teil 6: die Sprache in zehn Minuten, mit einem vollständigen Listen-Template.
- String-Template-Operatoren: Operatoren für die Elemente.
Verwandte Seiten
- Modul 2: Die Template-Sprache
- Entwickler: Kursüberblick
- Trainer: hier beginnen
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.