Introduction :
Avez-vous rencontré un phénomène étrange où le dernier L'élément de votre tableau PHP apparaît dupliqué après une itération dessus en utilisant foreach avec passage par référence ? Ce comportement déroutant soulève souvent des questions sur des bogues potentiels ou un comportement étrange du système.
Comprendre le comportement :
La clé pour comprendre cela est la nature du passage par référence dans les boucles foreach de PHP. Lors de l'utilisation de '&' dans le paramètre, la référence à l'élément du tableau est directement modifiée, plutôt qu'une copie. Cela signifie que toute modification apportée à la variable passée dans la boucle affecte directement le tableau d'origine.
Le bug en question :
Dans l'exemple fourni :
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) {} foreach ($arr as $item) {}
La première boucle foreach établit des références aux éléments du tableau. Puisque $item est désormais une référence, le modifier dans la boucle modifiera également l'élément de tableau correspondant.
La deuxième boucle foreach, cependant, n'établit pas de références. Cela signifie que lorsque la boucle attribue de nouvelles valeurs à $item, elle affecte uniquement la copie locale et ne met pas à jour le tableau d'origine.
L'effet de duplication :
Maintenant , considérons le cas où $item est une référence au dernier élément du tableau (c'est-à-dire 'baz'). Puisque la première boucle établit cette référence, la deuxième boucle utilise également la même référence. En conséquence, toute valeur attribuée à $item dans la deuxième boucle est transmise directement à $arr[2].
Par conséquent, lorsque la deuxième boucle attribue 'bar' à $item, elle remplace par inadvertance le dernier élément. du tableau avec « bar », conduisant à la duplication apparente.
Attendu par rapport au réel Sortie :
Avant les boucles : ["foo", "bar", "baz"]
Après la première boucle (référence) : ["foo", "bar" , "foo"] (puisque $item est toujours référencé à $arr[2])
Après la deuxième boucle (non-référence) : ["foo", "bar", "bar"]
Est-ce un bug ?
Non, ce comportement n'est pas un bug. C'est simplement la conséquence attendue de l'utilisation de références dans les boucles foreach de PHP. La valeur de $item, étant une référence à l'élément du tableau d'origine, affecte le tableau sous-jacent chaque fois qu'il est modifié.
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!