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 ?

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 ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-13 09:19:02366parcourir

Why does using pass-by-reference in a PHP `foreach` loop modify the array after the loop ends?

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!

Déclaration:
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