foreach
Das Schlüsselwort "foreach" ist ein Schleifenkonstrukt in PHP zum Iterieren über Arrays und Objekte.
Die PHP-foreach-Schleife
foreach ist PHPs dedizierte Schleife zum Iterieren über Arrays und Objekte. Im Gegensatz zu einer for-Schleife benötigt sie weder einen Zähler noch einen Index — sie durchläuft automatisch jedes Element, eines nach dem anderen, was sie zur häufigsten und fehlerunanfälligsten Methode macht, eine Sammlung in PHP zu verarbeiten.
Dieses Kapitel behandelt die zwei foreach-Formen, das Iterieren per Referenz, das Entpacken verschachtelter Arrays mit list(), den häufigsten Fallstrick und wann man foreach gegenüber den anderen PHP-Schleifen bevorzugen sollte.
Syntax
foreach hat zwei Formen.
Nur Wert — wenn nur der Wert jedes Elements benötigt wird:
foreach ($array as $value) {
// do something with $value
}Schlüssel und Wert — wenn auch der Array-Schlüssel benötigt wird (unverzichtbar bei assoziativen Arrays):
foreach ($array as $key => $value) {
// do something with $key and $value
}Bei jedem Durchlauf kopiert PHP das aktuelle Element in $value (und dessen Schlüssel in $key) und rückt dann zum nächsten Element vor, bis das Array erschöpft ist.
Iteration über ein indiziertes Array
Iteration über ein assoziatives Array
Mit der $key => $value-Form erhält man beide Hälften jedes Paares:
<?php
$person = ["name" => "John", "age" => 30, "city" => "New York"];
foreach ($person as $key => $value) {
echo $key . ": " . $value . PHP_EOL;
}
// Output:
// name: John
// age: 30
// city: New YorkWerte per Referenz ändern
Standardmäßig ist $value eine Kopie, daher wirkt sich eine Änderung innerhalb der Schleife nicht auf das ursprüngliche Array aus. Mit dem Präfix & wird per Referenz iteriert, sodass Änderungen zurückgeschrieben werden:
<?php
$prices = [10, 20, 30];
foreach ($prices as &$price) {
$price *= 2; // modifies the array in place
}
unset($price); // important: break the reference
print_r($prices);
// Output:
// Array
// (
// [0] => 20
// [1] => 40
// [2] => 60
// )Achtung: Nach einer Referenz-Schleife immer
unset($price)aufrufen. Die Variable zeigt noch auf das letzte Element, sodass eine spätere Zuweisung an$price— oder ein zweitesforeach, das den gleichen Namen verwendet — das Array stillschweigend beschädigen würde.
Verschachtelte Arrays mit list() entpacken
Wenn jedes Element selbst ein Array ist, kann es inline mit list() (oder der Kurzschreibweise [] ab PHP 7.1+) destrukturiert werden:
<?php
$points = [[1, 2], [3, 4], [5, 6]];
foreach ($points as [$x, $y]) {
echo "x=$x, y=$y" . PHP_EOL;
}
// Output:
// x=1, y=2
// x=3, y=4
// x=5, y=6Wann foreach verwenden?
foreachverwenden für jedes Array oder Iterable, bei dem alle Elemente durchlaufen werden sollen — es ist die klarste Wahl und kann nicht über das Ende des Arrays hinauslaufen.- Eine
for-Schleife verwenden, wenn eine genaue Kontrolle über den Zähler benötigt wird (überspringen, in 2er-Schritten zählen, rückwärts zählen). whileverwenden, wenn die Anzahl der Iterationen nicht im Voraus bekannt ist und von einer Bedingung abhängt.
Eine foreach-Schleife kann auch frühzeitig mit break beendet oder eine Iteration mit continue übersprungen werden, genauso wie in anderen Schleifen.