foreach
(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 einerforeach
-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.
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. |