Maison >développement back-end >tutoriel php >Pourquoi la boucle Foreach référencée par PHP présente-t-elle un comportement inattendu ?

Pourquoi la boucle Foreach référencée par PHP présente-t-elle un comportement inattendu ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-13 12:57:101062parcourir

Why Does PHP's Referenced Foreach Loop Exhibit Unexpected Behavior?

Comprendre le comportement étrange de la boucle Foreach référencée de PHP

En PHP, la boucle foreach parcourt les éléments d'un tableau ou d'un objet. Cependant, lors de l'utilisation d'une référence dans la boucle (par exemple, foreach ($a as &$v) { ... }), un comportement inattendu peut se produire.

Le problème

Considérez le script PHP suivant :

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

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

print_r($a);

Attendu Sortie :

Un tableau avec les éléments 'a', 'b', 'c' et 'd'.

Sortie réelle :

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

Explication

Le comportement inattendu survient car les références créées au sein la boucle foreach persiste après la fin de la boucle. Plus précisément, le dernier élément du tableau $a peut toujours être référencé par la variable $v.

Lorsque la deuxième boucle foreach s'exécute, $v (une référence au dernier élément de $a) se voit réaffecter la valeur. de chaque élément du tableau. Puisque $v est une référence au dernier élément de $a, l'élément de tableau correspondant est modifié.

Résolution

Pour éviter ce comportement, désactivez toujours la variable de référence une fois la boucle foreach terminée :

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

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

print_r($a);

Sortie :

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

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