Pourquoi le dernier élément d'un tableau PHP apparaît-il dupliqué après avoir utilisé foreach avec passage par référence ?

Susan Sarandon
Libérer: 2024-11-15 00:18:02
original
954 Les gens l'ont consulté

Why does the last element of a PHP array appear duplicated after using foreach with pass-by-reference?

PHP Foreach Pass by Reference : Duplication d'éléments mystérieux

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) {}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal