Maison > développement back-end > tutoriel php > Pourquoi ma boucle PHP foreach avec passage par référence modifie-t-elle mon tableau de manière inattendue ?

Pourquoi ma boucle PHP foreach avec passage par référence modifie-t-elle mon tableau de manière inattendue ?

Barbara Streisand
Libérer: 2024-11-13 10:54:02
original
574 Les gens l'ont consulté

Why does my PHP foreach loop with pass-by-reference change my array unexpectedly?

PHP Foreach Pass by Reference : duplication du dernier élément ? (Bug ?)

Comprendre le problème

Considérez le code PHP suivant :

$arr = array("foo", "bar", "baz");

foreach ($arr as &$item) {}
print_r($arr);

foreach ($arr as $item) {}
print_r($arr); // $arr has changed to ["foo", "bar", "bar"]
Copier après la connexion

Après la première boucle, le tableau est imprimé comme prévu :

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Copier après la connexion

Cependant, après la deuxième boucle, le tableau change de manière inattendue :

Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)
Copier après la connexion

Explication

Le problème se produit parce que la première boucle foreach passe $item par référence. Cela signifie que $item est un alias pour les éléments du tableau $arr. Dans la première boucle, aucune modification n'est apportée à $item ou $arr.

Cependant, la deuxième boucle transmet $item par valeur. Lorsque la valeur de $item reçoit une nouvelle valeur dans la boucle, l'élément correspondant dans $arr est également modifié.

Plus précisément, le troisième élément de $arr ("baz") est écrasé par la valeur de le deuxième élément ("bar") lors de la dernière itération de la deuxième boucle. Cela explique pourquoi le dernier élément de $arr est dupliqué après la deuxième boucle.

Est-ce un bug ?

Non, ce comportement n'est pas un bug. C'est le comportement prévu des boucles foreach lors du passage de variables par référence. Il est important d'être conscient de ce comportement pour éviter des changements inattendus dans vos tableaux.

Débogage de la sortie

Pour vous aider à visualiser le comportement, le code suivant ajoute des instructions d'écho pour imprimer la valeur de $item et du tableau $arr après chaque itération des boucles :

echo "<br>";

foreach ($arr as &$item) {
    echo "Item: $item; Arr: ";
    print_r($arr);
    echo "<br>";
}

echo "<br>";

foreach ($arr as $item) {
    echo "Item: $item; Arr: ";
    print_r($arr);
    echo "<br>";
}
Copier après la connexion

La sortie montre comment $item et $arr changent au cours des boucles, illustrant clairement le comportement décrit ci-dessus.

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