Maison >développement back-end >tutoriel php >Pourquoi le dernier élément d'un tableau PHP est-il dupliqué lors de l'utilisation d'une boucle foreach avec passage par référence ?

Pourquoi le dernier élément d'un tableau PHP est-il dupliqué lors de l'utilisation d'une boucle foreach avec passage par référence ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-14 20:19:01453parcourir

Why does the last element in a PHP array duplicate when using a foreach loop with pass-by-reference?

PHP Foreach Pass by Reference : le mystère de la duplication du dernier élément dévoilé

Considérez le code PHP suivant :

$arr = ["foo", "bar", "baz"];

foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);

foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr);

Lors de l'exécution, il modifie de manière inattendue le tableau d'origine $arr, ce qui entraîne le résultat suivant sortie :

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

Comprendre le comportement

Après la boucle foreach initiale, la variable $item reste une référence au même emplacement mémoire que $arr[2] . Par conséquent, chaque itération de la deuxième boucle foreach, qui transmet les arguments par valeur, remplace la valeur référencée (et donc $arr[2]) par la valeur de la nouvelle itération.

Explication détaillée

Dans la première boucle :

  • $item fait référence à la valeur à $arr[0], qui est 'foo'.
  • $item et $arr[0] pointent tous deux vers 'foo'.
  • Ce processus se répète pour $arr[1] et $arr[2].

A la fin de la première boucle, $item pointe toujours vers $arr[2].

Dans la seconde loop:

  • $item se voit attribuer la valeur de $arr[0], qui est 'foo'.
  • $arr[2] (toujours référencé par $item) est également défini sur 'foo'.
  • Cela écrase la valeur originale de 'baz' à $arr[2].
  • La même le processus se produit pour $arr[1], et enfin, $arr[2] se voit attribuer la valeur de $arr[2], qui est maintenant « bar » en raison de l'itération précédente.

Clarifier les idées fausses

Ce comportement n'est pas considéré comme un bug. Cela correspond au comportement prévu des références en PHP. Des résultats similaires seraient observés si vous utilisiez la syntaxe suivante en dehors d'une boucle :

for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }

Conclusion

Lorsque vous travaillez avec des références en PHP, il est crucial de reconnaître que les modifications apportées via la variable référencée affecteront également la valeur d'origine. Ce comportement peut être exploité efficacement ou évité en fonction du résultat souhaité.

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