Maison >développement back-end >tutoriel php >Pourquoi l'utilisation d'une référence dans une boucle PHP Foreach conduit-elle à des valeurs d'éléments répétées ?

Pourquoi l'utilisation d'une référence dans une boucle PHP Foreach conduit-elle à des valeurs d'éléments répétées ?

DDD
DDDoriginal
2024-12-15 07:29:13538parcourir

Why Does Using a Reference in a PHP Foreach Loop Lead to Repeated Element Values?

Pourquoi la valeur de l'élément est-elle répétée dans le tableau lors de l'utilisation d'une référence à l'intérieur de Foreach ?

Considérez le code PHP suivant :

$a = array('a', 'b', 'c', 'd');

foreach ($a as &$v) { }
foreach ($a as $v) { }

print_r($a);

Étonnamment, le résultat révèle que la valeur du dernier élément a écrasé les valeurs des autres éléments, ce qui entraîne dans :

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => c
)

Expliquer la bizarrerie

Ce comportement est un aspect documenté de PHP qui découle de l'utilisation d'une référence (&) dans la première boucle foreach .

Lors de la première boucle, chaque élément du tableau est affecté à $v par référence. Lorsque $v est modifié, cela change l'élément référencé dans le tableau d'origine. Ainsi, lorsque $v est réaffecté dans la boucle suivante, cela modifie par inadvertance l'élément du tableau correspondant à la référence.

Solution

Pour éviter ce problème, désactivez explicitement le référence au dernier élément avant la deuxième boucle foreach :

foreach ($a as &$v) { }
unset($v);
foreach ($a as $v) { }

print_r($a);

Comprendre le pas à pas Processus

Voici une explication étape par étape de ce qui se passe dans le code :

  • Première boucle foreach :

    • Itération 1 : $v est une référence à $a[0] ('a')
    • Itération 2 : $v est un référence à $a[1] ('b')
    • Itération 3 : $v est une référence à $a[2] ('c')
    • Itération 4 : $v est un référence à $a[3] ('d')
  • A la fin de la première boucle, $v fait toujours référence à $a[3] ('d').
  • Deuxième boucle foreach :

    • Itération 1 : $v reste comme référence à $a[3], mais sa valeur est définie sur $a[0] (« a »). Cela change $a[3] en 'a'.
    • Itérations 2 à 4 : les itérations suivantes répètent ce processus, en écrasant $a[3] par les valeurs de $a[1] ('b'), $a[2] ('c'), et enfin, $a[3] ('c').

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