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)
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@
.
(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:
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
?>
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;
}
?>
An easier way to unpack nested array elements
$array = [
[1, 2],
[3, 4],
];
foreach ($array as [$a, $b]) {
echo "A: $a; B: $b\n";
}