Maison  >  Article  >  développement back-end  >  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
Barbara Streisandoriginal
2024-11-13 10:54:02502parcourir

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

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

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"]

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

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)

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

Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)

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>";
}

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!

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