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
Libérer: 2024-11-13 09:19:02
original
390 Les gens l'ont consulté

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"]
Copier après la connexion

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

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

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!

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