## foreach

(PHP 4, PHP 5, PHP 7, PHP 8)

La structure de langage `foreach` fournit une façon simple de parcourir des array et objets Traversable. `foreach` générera une erreur lorsqu'il est utilisé avec une variable contenant un type de données différent ou avec une variable non initialisée.

`foreach` peut éventuellement obtenir la `clé` de chaque élément :

    foreach (iterable_expression as $value) {
        statement_list
    }

    foreach (iterable_expression as $key => $value) {
        statement_list
    }

La première forme passe en revue le tableau `iterable_expression`. À chaque itération, la valeur de l'élément courant est assignée à `$value`.

La seconde forme assignera en plus la clé de l'élément courant à la variable `$key` à chaque itération.

Il est à noter que `foreach` ne modifie pas le pointeur interne du tableau, qui est utilisé par les fonctions tel que current() et key().

Il est possible de personnaliser l'itération sur des objets.

Exemple #1 Utilisations courantes de `foreach`

`<?php
/* Exemple : valeur uniquement */
$array = [1, 2, 3, 17];
foreach ($array as $value) {
echo "Valeur courante de \$array: $value.\n";
}
/* Exemple : clé et valeur */
$array = [
"un" => 1,
"deux" => 2,
"trois" => 3,
"dix-sept" => 17
];
foreach ($array as $key => $value) {
echo "\$array[$key] => $value.\n";
}
/* Exemple : tableaux clé-valeur multidimensionnels */
$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 "Valeur à la position x=$x et y=$y : $value\n";
}
}
/* Exemple : tableaux dynamiques */
foreach (range(1, 5) as $value) {
echo "$value\n";
}
?>`

> Note:

> `foreach` ne prend pas en charge la possibilité de supprimer les messages d'erreur en utilisant le `@`.

### Extraction des tableaux internes

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Il est possible d'itérer sur un tableau de tableaux et de décomposer le tableau imbriqué dans des variables de boucle en utilisant soit la déstructuration de tableau via `[]` ou en utilisant le constructeur de langage list() comme valeur.

> Note: A noter que la déstructuration de tableau via `[]` n'est possible qu'à partir de PHP 7.1.0

Dans les deux exemples suivants, `$a` sera défini sur le premier élément du tableau imbriqué et `$b` contiendra le deuxième élément :

`<?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";
}
?>`

L'exemple ci-dessus va afficher :

    A: 1; B: 2
    A: 3; B: 4

Lorsqu'il y a moins de variables que d'éléments dans le tableau, les éléments restants seront ignorés. De même, les éléments peuvent être ignorés en utilisant une virgule :

`<?php
$array = [
[1, 2, 3],
[3, 4, 6],
];
foreach ($array as [$a, $b]) {
// Notez qu'il n'y a pas de $c ici.
echo "$a $b\n";
}
foreach ($array as [, , $c]) {
// Ignorer $a et $b
echo "$c\n";
}
?>`

L'exemple ci-dessus va afficher :

    1 2
    3 4
    5
    6

Une notification sera générée s'il n'y a pas assez d'éléments dans le tableau pour remplir la fonction list() :

`<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as [$a, $b, $c]) {
echo "A: $a; B: $b; C: $c\n";
}
?>`

L'exemple ci-dessus va afficher :

    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 et références

Il est possible de modifier directement les éléments du tableau dans une boucle en précédant `$value` de `&`. Dans ce cas, la valeur sera assignée par référence.

`<?php
$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr est maintenant [2, 4, 6, 8]
unset($value); // rompre la référence avec le dernier élément
?>`
Avertissement

La référence à `$value` du dernier élément du tableau demeure même après la boucle `foreach`. Il est recommandé de détruire ces références en utilisant unset(). Sinon, le comportement suivant se produira :

`<?php
$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr est maintenant [2, 4, 6, 8]
// sans unset($value), $value est toujours une référence au dernier élément : $arr[3]
foreach ($arr as $key => $value) {
// $arr[3] sera mis à jour avec chaque valeur de $arr...
echo "{$key} => {$value} ";
print_r($arr);
}
// ...jusqu'à ce que finalement l'avant-dernière valeur soit copiée sur la dernière valeur
?>`

L'exemple ci-dessus va afficher :

    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 )

Exemple #2 Itérer sur les valeurs d'un tableau constant par référence

`<?php
foreach ([1, 2, 3, 4] as &$value) {
$value = $value * 2;
}
?>`

### Voir aussi

- array
- Traversable
- iterable
- list()