Maison > Article > développement back-end > Pourquoi l'utilisation du passage par référence dans une boucle PHP « foreach » modifie-t-elle le tableau une fois la boucle terminée ?
PHP Foreach Pass by Reference et modification de tableau
En PHP, l'utilisation du passage par référence dans une boucle foreach peut conduire à un comportement inattendu. Considérez le code suivant :
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) {} // Array remains unchanged: ["foo", "bar", "baz"] foreach ($arr as $item) {} // Array is modified: ["foo", "bar", "bar"]
Pourquoi la deuxième boucle modifie-t-elle le tableau ?
Dans la première boucle, la variable $item est passée par référence. Cela signifie que les modifications apportées à $item affectent également l'élément correspondant dans le tableau $arr. Cependant, dans la deuxième boucle, $item est passé par valeur. Ainsi, les modifications apportées à $item n'affectent pas le tableau.
Essentiellement, après la première boucle, $item fait toujours référence au dernier élément de $arr. Lorsque la deuxième boucle parcourt le tableau, chaque valeur de $item écrase le dernier élément de $arr car ils font tous deux référence au même emplacement mémoire.
Débogage de la sortie
Pour comprendre le comportement, nous pouvons faire écho à la valeur actuelle de $item et imprimer récursivement le tableau $arr à chaque boucle itération.
Première boucle :
foo Array ( [0] => foo [1] => bar [2] => baz ) bar Array ( [0] => foo [1] => bar [2] => baz ) baz Array ( [0] => foo [1] => bar [2] => baz )
Après la première boucle, $item pointe vers le dernier élément de $arr.
Deuxième boucle :
foo Array ( [0] => foo [1] => bar [2] => foo ) bar Array ( [0] => foo [1] => bar [2] => bar ) bar Array ( [0] => foo [1] => bar [2] => bar )
Comme chaque valeur de $item est écrasée, elle modifie également le dernier élément de $arr.
Est-ce un bug ?
Non, ce comportement n'est pas un bug mais plutôt le comportement prévu du passage par référence. Il est important de comprendre les implications du passage de variables par référence et de l'utiliser de manière appropriée.
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!