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
Libérer: 2024-12-13 12:57:10
original
1012 Les gens l'ont consulté

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);
Copier après la connexion

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
)
Copier après la connexion

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);
Copier après la connexion

Sortie :

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
)
Copier après la connexion

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