Après la première boucle foreach, $item
est encore une référence à une certaine valeur qui est également utilisée par $arr[2]
. De sorte que chaque foreach appel dans la deuxième boucle, qui n'a pas d'appel par référence, remplace cette valeur, et donc de $arr[2]
, avec la nouvelle valeur.
Donc la boucle 1, la valeur et l' $arr[2]
deviennent $arr[0]
, ce qui est "foo".
La boucle 2, la valeur et l' $arr[2]
deviennent $arr[1]
, ce qui est "bar".
La boucle 3, la valeur et l' $arr[2]
deviennent $arr[2]
, ce qui est " bar " (à cause de la boucle 2).
La valeur 'baz' est, de fait, perdu à la suite du premier appel, la deuxième boucle foreach.
La Sortie de débogage
Pour chaque itération de la boucle, nous nous ferons l'écho de la valeur de $item
ainsi que de façon récursive imprimer le tableau d' $arr
.
Lors de la première boucle est exécutée, nous voyons cette sortie:
foo
Array ( [0] => foo [1] => bar [2] => baz )
bar
Array ( [0] => foo [1] => bar [2] => baz )
baz
Array ( [0] => foo [1] => bar [2] => baz )
À la fin de la boucle, $item
pointe toujours à la même place qu' $arr[2]
.
Lors de la deuxième boucle est exécutée, nous voyons cette sortie:
foo
Array ( [0] => foo [1] => bar [2] => foo )
bar
Array ( [0] => foo [1] => bar [2] => bar )
bar
Array ( [0] => foo [1] => bar [2] => bar )
Vous verrez comment chaque moment de la matrice de mettre une nouvelle valeur en $item
, elle a également mis à jour $arr[3]
avec la même valeur, car ils sont les deux qui pointe toujours vers le même endroit. Lorsque la boucle est à la troisième valeur de la pile, il contiendra la valeur bar
parce que c'était juste fixé par la précédente itération de la boucle.
Est-ce un bug?
Pas de. C'est le comportement d'un élément référencé, et non pas d'un bug. Il serait similaire à l'exécution de quelque chose comme:
for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }
Une boucle foreach n'est pas spécial à la nature dans laquelle il peut ignorer les éléments référencés. C'est tout simplement le réglage de cette variable à la nouvelle valeur à chaque fois, comme vous le feriez à l'extérieur d'une boucle.