for
PHP for-Schleife verstehen: Initialisierung, Bedingung, Inkrement, Array-Iteration, verschachtelte Schleifen und Off-by-one-Fehler vermeiden.
Die PHP for-Schleife
for ist PHPs zählergesteuerte Schleife. Sie wird verwendet, wenn man genau weiß — oder berechnen kann — wie oft ein Codeblock ausgeführt werden soll, z. B. beim Iterieren von 0 bis count($array) - 1, beim Herunterzählen oder beim Springen in Schritten. Diese Seite behandelt die drei Teile des Schleifenkopfs, wie jeder davon ausgeführt wird, wie man arrays iteriert, unendliche und verschachtelte Schleifen, die alternative endfor-Syntax und die Off-by-one-Fehler, die die meisten Anfänger erwischen.
Wenn Sie stattdessen über jedes Element eines arrays oder objects gehen möchten, ohne einen Index zu verwalten, ist foreach in der Regel das bessere Werkzeug. Für eine Schleife, die läuft, bis eine Bedingung falsch wird, siehe while. Ein allgemeiner Vergleich aller Schleifentypen findet sich unter PHP Loops.
Syntax
for (initialization; condition; increment) {
// code to be executed on each pass
}Der Kopf hat drei Ausdrücke, durch Semikolons getrennt:
| Ausdruck | Wann er ausgeführt wird | Typische Verwendung |
|---|---|---|
initialization | Einmal, bevor die Schleife startet | Einen Zähler einrichten, z. B. $i = 0 |
condition | Vor jeder Iteration | Schleife läuft weiter, solange er truthy ist |
increment | Nach jeder Iteration | Den Zähler weiterschalten, z. B. $i++ |
Die Ausführungsreihenfolge ist: initialization ausführen, condition auswerten; wenn sie wahr ist, den Rumpf ausführen, dann increment ausführen, dann condition erneut auswerten, und so weiter. In dem Moment, in dem condition false ergibt, stoppt die Schleife und der Rumpf wird in diesem letzten Durchlauf nicht ausgeführt.
Ein erstes Beispiel
<?php
for ($i = 1; $i <= 5; $i++) {
echo $i . PHP_EOL;
}
// Output:
// 1
// 2
// 3
// 4
// 5Der Zähler beginnt bei 1. Nach der Ausgabe von 5 macht $i++ daraus 6, 6 <= 5 ist false, und die Schleife endet — sie läuft also genau fünf Mal.
Über ein Array iterieren
Eine klassische Verwendung von for ist das Indizieren in ein array. count() in einer Variable zwischenspeichern (oder den Inkrement-Slot verwenden), damit PHP das array nicht bei jedem Durchlauf neu zählt:
<?php
$colors = ["red", "green", "blue"];
for ($i = 0, $n = count($colors); $i < $n; $i++) {
echo $colors[$i] . PHP_EOL;
}
// Output:
// red
// green
// blueBeachten Sie, dass array-Indizes bei 0 beginnen, sodass der letzte gültige Index count($colors) - 1 ist. Die Bedingung verwendet < (nicht <=) genau deshalb — die Verwendung von <= würde ein Element über das Ende hinaus lesen. Wenn Sie nur die Werte und nicht den Index benötigen, bevorzugen Sie foreach, das diese ganze Klasse von Off-by-one-Fehlern vermeidet.
Herunterzählen und Schritte
Der Inkrement-Ausdruck ist nur Code — er kann dekrementieren oder um einen beliebigen Betrag springen:
<?php
// Count down
for ($i = 5; $i >= 1; $i--) {
echo $i . " ";
}
echo PHP_EOL;
// Output: 5 4 3 2 1
// Step by 2 (even numbers only)
for ($i = 0; $i <= 10; $i += 2) {
echo $i . " ";
}
// Output: 0 2 4 6 8 10Mehrere Ausdrücke und leere Slots
Jeder der drei Slots kann mehrere kommagetrennte Ausdrücke enthalten, und ein Slot kann leer gelassen werden. Die Semikolons sind auch bei leeren Slots erforderlich:
<?php
// Two counters moving toward each other
for ($i = 0, $j = 10; $i < $j; $i++, $j--) {
echo "$i-$j" . PHP_EOL;
}
// Output:
// 0-10
// 1-9
// 2-8
// 3-7
// 4-6Wenn der Bedingungsslot leer ist, wird er als true behandelt, was eine unendliche Schleife ergibt. Die Schleife wird dann von innen mit break beendet:
<?php
$i = 0;
for (;;) {
if ($i >= 3) {
break;
}
echo $i . PHP_EOL;
$i++;
}
// Output:
// 0
// 1
// 2Verwenden Sie continue, um den Rest der aktuellen Iteration zu überspringen und direkt zum Inkrement-Schritt zu springen.
Verschachtelte Schleifen
Das Platzieren einer for-Schleife innerhalb einer anderen ermöglicht die Arbeit mit Gittern, Tabellen und multiplikationsähnlichen Mustern. Verwenden Sie für jede Ebene unterschiedliche Zählernamen:
<?php
for ($row = 1; $row <= 3; $row++) {
for ($col = 1; $col <= 3; $col++) {
echo ($row * $col) . "\t";
}
echo PHP_EOL;
}
// Output:
// 1 2 3
// 2 4 6
// 3 6 9Die innere Schleife durchläuft alle ihre Iterationen für jeden einzelnen Durchlauf der äußeren Schleife.
Alternative endfor-Syntax
PHP bietet eine Doppelpunkt-/endfor-Form, die beim Mischen von Schleifen mit HTML in Templates praktisch ist, da sie schwebende schließende geschweifte Klammern vermeidet:
<?php for ($i = 1; $i <= 3; $i++): ?>
<p>Item <?= $i ?></p>
<?php endfor; ?>Dies rendert drei <p>-Absätze. Die gleiche alternative Syntax existiert für foreach/endforeach.
Häufige Fallstricke
- Off-by-one-Fehler.
$i <= count($arr)liest einen Slot über das Ende hinaus (eine Warnung über einen undefinierten Index); verwenden Sie$i < count($arr). - Ändern der Array-Länge innerhalb der Schleife. Wenn der Rumpf Elemente hinzufügt oder entfernt, kann ein zwischengespeichertes
count()veralten — erneut prüfen oder zuforeachwechseln. - Versehentliche unendliche Schleifen. Das Vergessen des Inkrements oder das Vergleichen in der falschen Richtung (z. B.
$i--mit$i < 10) bedeutet, dass die Bedingung nie false wird. - Gleitkommazähler. Das Schrittweise Vorgehen um
0.1akkumuliert Rundungsfehler und kann die Grenze überschreiten; besser mit Ganzzahlen schleifen und innerhalb des Rumpfs dividieren.
Wann for verwenden
Verwenden Sie for, wenn die Anzahl der Iterationen im Voraus bekannt oder berechnet ist und der Index wirklich gebraucht wird (Countdowns, feste Wiederholung, Schritte, Tabellen aufbauen). Wenn Sie einfach jedes Element einer Collection möchten, ist foreach sauberer und sicherer. Wenn die Anzahl der Wiederholungen von einer Bedingung abhängt, die sich innerhalb der Schleife ändert, verwenden Sie while oder do...while.