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 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 (iterable_expression as $value) statement foreach (iterable_expression as $key => $value) statement
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.
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 )
?>
Es ist möglich, über die Werte eines konstanten Arrays mittels Referenz zu iterieren:
<?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 8)
Es ist möglich, ü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:
An easier way to unpack nested array elements
$array = [
[1, 2],
[3, 4],
];
foreach ($array as [$a, $b]) {
echo "A: $a; B: $b\n";
}