(PHP 4, PHP 5, PHP 7)
Das foreach-Konstrukt bietet eine einfache Möglichkeit über Arrays zu iterieren. foreach arbeitet nur mit Arrays und Objekten zusammen und gibt beim Versuch es mit einer Variablen mit einem anderen Datentypen oder einer nicht initialisierten Variablen zu benutzen einen Fehler aus. Es gibt zwei Schreibweisen:
foreach (array_expression as $value) statement foreach (array_expression as $key => $value) statement
Die erste Form durchläuft das in array_expression angegebene Array. Bei jedem Durchlauf wird der Wert des aktuellen Elementes der Variable $value zugewiesen und der interne Array-Zeiger um eins erhöht (womit im nächsten Durchlauf das nächste Element betrachtet wird).
Die zweite Form schreibt zusätzlich den Schlüssel des aktuellen Elementes in jedem Durchlauf in die Variable $key.
Es ist möglich, die Objektiteration anzupassen.
Hinweis:
Zu Beginn der Ausführung unter PHP 5 setzt foreach den internen Arrayzeiger automatisch auf das erste Element des Arrays zurück. Das bedeutet, dass es nicht notwendig ist vor einer foreach-Schleife reset() aufzurufen.
Da foreach sich unter PHP 5 auf den internen Arrayzeiger verlässt, kann es zu unerwartetem Verhalten führen, wenn dieser innerhalb der Schleife verändert wird.
Unter PHP 7 verwendet foreach den internen Arrayzeiger nicht.
Um Arrayelemente innerhalb der Schleife direkt verändern zu können, muss dem Variablennamen $value ein & vorangestellt werden. In diesem Fall wird dieser Variablen eine Referenz zugewiesen.
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr ist nun array(2, 4, 6, 8)
unset($value); // Entferne die Referenz auf das letzte Element
?>
Die Referenz eines $value auf das letzte Arrayelement bleiben auch nach der foreach-Schleife bestehen. Es wird empfohlen, diese durch unset() zu zerstören. Andernfalls ist folgendes Verhalten zu beobachten:
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr ist jetzt array(2, 4, 6, 8)
// ohne ein unset($value), bleibt $value weiterhin eine Referenz auf das letzte Element: $arr[3]
foreach ($arr as $key => $value) {
// $arr[3] wird mit jedem Wert von $arr aktualisiert...
echo "{$key} => {$value} ";
print_r($arr);
}
// bis schließlich der vorletzte Wert in den letzten Wert kopiert wird
// Ausgabe:
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>
Vor PHP 5.5.0 ist eine Referenz auf $value nur dann möglich, wenn das Array referenzierbar ist (d.h. es ist eine Variable). Der folgende Code funktioniert erst ab PHP 5.5.0:
<?php
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
?>
Hinweis:
foreach unterstützt die Fehlerunterdrückung mittels '@' nicht.
Eventuell haben Sie bemerkt, dass folgendes identisch funktioniert:
<?php
$arr = array("eins", "zwei", "drei");
reset($arr);
while (list(, $value) = each($arr)) {
echo "Wert: $value<br />\n";
}
foreach ($arr as $value) {
echo "Wert: $value<br />\n";
}
?>
Das Folgende ist ebenfalls funktional identisch:
<?php
$arr = array("eins", "zwei", "drei");
reset($arr);
while (list($key, $value) = each($arr)) {
echo "Schlüssel: $key; Wert: $value<br />\n";
}
foreach ($arr as $key => $value) {
echo "Schlüssel: $key; Wert: $value<br />\n";
}
?>
Einige weitere Beispiele die die Nutzung demonstrieren:
<?php
/* foreach Beispiel 1: Nur Werte */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Aktueller Wert von \$a: $v.\n";
}
/* foreach Beispiel 2: Werte (mit Schreibweise für Zugriff zur Veranschaulichung) */
$a = array(1, 2, 3, 17);
$i = 0; /* nur zur Veranschaulichung */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* foreach Beispiel 3: Schlüssel und Wert */
$a = array(
"eins" => 1,
"zwei" => 2,
"drei" => 3,
"siebzehn" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* foreach Beispiel 4: Mehrdimensionale Arrays */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}
/* foreach Beispiel 5: Dynamische Arrays */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
(PHP 5 >= 5.5.0, PHP 7)
PHP 5.5 hat die Fähigkeit hinzugefügt über Arrays von Arrays zu iterieren und dabei die verschachtelten Arrays in Schleifenvariablen zu entpacken, indem man ein list() als Wert angibt.
For example:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b)) {
// $a enthält das erste Element des verschachtelten Arrays
// und $b enthält das zweite Element
echo "A: $a; B: $b\n";
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
A: 1; B: 2 A: 3; B: 4
Es können auch weniger Elemente in list() angegeben werden als das verschachtelte Array enthält. In diesem Fall werden übrige Werte im Array ignoriert:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a)) {
// Beachten Sie, dass es hier kein $b gibt.
echo "$a\n";
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
1 3
Gibt es nicht ausreichend Elemente im Array, um list() zu füllen, wird eine Notice erzeugt.
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b, $c)) {
echo "A: $a; B: $b; C: $c\n";
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Notice: Undefined offset: 2 in example.php on line 7 A: 1; B: 2; C: Notice: Undefined offset: 2 in example.php on line 7 A: 3; B: 4; C:
Version | Beschreibung |
---|---|
7.0.0 | foreach verwendet den internen Arrayzeiger nicht mehr. |
5.5.0 | Die Referenzierung von $value wird für Ausdrücke unterstützt. Zuvor wurden nur Variablen unterstützt. |
5.5.0 | Das Entpacken verschachtelter Arrays mit list() wird unterstützt. |