Maison > Article > développement back-end > Pourquoi ma boucle PHP foreach avec passage par référence modifie-t-elle mon tableau de manière inattendue ?
PHP Foreach Pass by Reference : duplication du dernier élément ? (Bogue ?)
Comprendre le problème
Considérez le code PHP suivant :
$arr = array("foo", "bar", "baz"); foreach ($arr as &$item) {} print_r($arr); foreach ($arr as $item) {} print_r($arr); // $arr has changed to ["foo", "bar", "bar"]
Après la première boucle, le tableau est imprimé comme prévu :
Array ( [0] => foo [1] => bar [2] => baz )
Cependant, après la deuxième boucle, le tableau change de manière inattendue :
Array ( [0] => foo [1] => bar [2] => bar )
Explication
Le problème se produit parce que la première boucle foreach passe $item par référence. Cela signifie que $item est un alias pour les éléments du tableau $arr. Dans la première boucle, aucune modification n'est apportée à $item ou $arr.
Cependant, la deuxième boucle transmet $item par valeur. Lorsque la valeur de $item reçoit une nouvelle valeur dans la boucle, l'élément correspondant dans $arr est également modifié.
Plus précisément, le troisième élément de $arr ("baz") est écrasé par la valeur de le deuxième élément ("bar") lors de la dernière itération de la deuxième boucle. Cela explique pourquoi le dernier élément de $arr est dupliqué après la deuxième boucle.
Est-ce un bug ?
Non, ce comportement n'est pas un bug. C'est le comportement prévu des boucles foreach lors du passage de variables par référence. Il est important d'être conscient de ce comportement pour éviter des changements inattendus dans vos tableaux.
Débogage de la sortie
Pour vous aider à visualiser le comportement, le code suivant ajoute des instructions d'écho pour imprimer la valeur de $item et du tableau $arr après chaque itération des boucles :
echo "<br>"; foreach ($arr as &$item) { echo "Item: $item; Arr: "; print_r($arr); echo "<br>"; } echo "<br>"; foreach ($arr as $item) { echo "Item: $item; Arr: "; print_r($arr); echo "<br>"; }
La sortie montre comment $item et $arr changent au cours des boucles, illustrant clairement le comportement décrit ci-dessus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!