An easier way to unpack nested array elements
$array = [
[1, 2],
[3, 4],
];
foreach ($array as [$a, $b]) {
echo "A: $a; B: $b\n";
}
(PHP 4, PHP 5, PHP 7, PHP 8)
Das foreach
-Konstrukt bietet eine einfache Möglichkeit
über arrays und
Traversable-Objekte zu iterieren.
foreach
erzeugt einen Fehler, wenn es mit einer Variablen
verwendet wird, die einen anderen Datentyp enthält oder mit einer Variablen,
die nicht initialisiert wurde.
foreach
kann optional den Schlüssel
jedes Elements erhalten:
foreach (iterable_expression as $value) { statement_list } foreach (iterable_expression as $key => $value) { statement_list }
Die erste Form durchläuft das in
iterable_expression
angegebene Iterable.
Bei jedem Durchlauf wird der Wert des aktuellen Elementes der
Variable $value
zugewiesen.
Die zweite Form schreibt zusätzlich den Schlüssel des aktuellen
Elementes in jedem Durchlauf in die Variable $key
.
Es ist zu beachten, dass foreach
den internen Array-Zeiger
nicht verändert, der von Funktionen wie current() und
key() verwendet wird.
Es ist möglich, die Objektiteration anzupassen.
Beispiel #1 Gängige Verwendungen von foreach
<?php
/* Beispiel: Nur Werte */
$array = [1, 2, 3, 17];
foreach ($array as $value) {
echo "Aktueller Wert von \$array: $value.\n";
}
/* Beispiel: Schlüssel und Wert */
$array = [
"eins" => 1,
"zwei" => 2,
"drei" => 3,
"siebzehn" => 17
];
foreach ($array as $key => $value) {
echo "Schlüssel: $key => Wert: $value\n";
}
/* Beispiel: Mehrdimensionale Schlüssel-Wert-Arrays */
$grid = [];
$grid[0][0] = "a";
$grid[0][1] = "b";
$grid[1][0] = "y";
$grid[1][1] = "z";
foreach ($grid as $y => $row) {
foreach ($row as $x => $value) {
echo "Wert an Position x=$x und y=$y: $value\n";
}
}
/* Beispiel: Dynamische Arrays */
foreach (range(1, 5) as $value) {
echo "$value\n";
}
?>
Hinweis:
foreach
unterstützt die Fehlerunterdrückung mittels@
nicht
(PHP 5 >= 5.5.0, PHP 7, PHP 8)
Es ist möglich, über Arrays von Arrays zu iterieren
und dabei die verschachtelten Arrays in Schleifenvariablen zu entpacken,
indem entweder die
Array-Destrukturierung
mittels []
oder das Sprachkonstrukt
list() als Wert verwendet wird.
Hinweis: Es ist zu beachten, dass die Array-Destrukturierung mittels
[]
erst seit PHP 7.1.0 möglich ist.
In den beiden folgenden Beispielen wird $a
auf das
erste Element des verschachtelten Arrays gesetzt und $b
enthält das zweite Element:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as [$a, $b]) {
echo "A: $a; B: $b\n";
}
foreach ($array as list($a, $b)) {
echo "A: $a; B: $b\n";
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
A: 1; B: 2 A: 3; B: 4
Wenn weniger Variablen angegeben werden, als Elemente im Array vorhanden sind, werden die restlichen Elemente ignoriert. Ebenso können Elemente durch die Verwendung eines Kommas übersprungen werden:
<?php
$array = [
[1, 2, 3],
[3, 4, 6],
];
foreach ($array as [$a, $b]) {
// Beachten Sie, dass es hier kein $c gibt.
echo "$a $b\n";
}
foreach ($array as [, , $c]) {
// $a und $b überspringen
echo "$c\n";
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
1 2 3 4 5 6
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 [$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:
Array-Elemente können innerhalb einer Schleife direkt geändert werden, indem
$value
ein &
vorangestellt wird.
In diesem Fall wird der Wert per
Referenz zugewiesen.
<?php
$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr ist nun [2, 4, 6, 8]
unset($value); // die Referenz mit dem letzten Element aufheben
?>
Die Referenz auf ein $value
des letzten Array-Elements
bleibt auch nach der foreach
-Schleife erhalten. Es wird
empfohlen, diese mittels unset() zu löschen.
Andernfalls tritt folgendes Verhalten auf:
<?php
$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr ist nun [2, 4, 6, 8]
// ohne unset($value) ist $value immer noch eine Referenz
// auf das letzte Element: $arr[3]
foreach ($arr as $key => $value) {
// $arr[3] wird mit jedem Wert aus $arr aktualisiert...
echo "{$key} => {$value} ";
print_r($arr);
}
// ...bis schließlich der vorletzte Wert auf den letzten Wert kopiert wird
?>
Das oben gezeigte Beispiel erzeugt folgende 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 )
Beispiel #2 Werte eines konstanten Arrays per Referenz durchlaufen
<?php
foreach ([1, 2, 3, 4] as &$value) {
$value = $value * 2;
}
?>
An easier way to unpack nested array elements
$array = [
[1, 2],
[3, 4],
];
foreach ($array as [$a, $b]) {
echo "A: $a; B: $b\n";
}