foreach

(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

Entpacken verschachtelter Arrays

(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:

foreach und Referenzen

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
?>

Warnung

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;
}
?>
add a note

User Contributed Notes 1 note

up
40
Okafor Chiagozie
2 years ago
An easier way to unpack nested array elements

$array = [
[1, 2],
[3, 4],
];

foreach ($array as [$a, $b]) {
echo "A: $a; B: $b\n";
}
To Top