Maison > développement back-end > tutoriel php > Pourquoi le foreach de PHP avec passage par référence (&) modifie-t-il les éléments du tableau de manière inattendue ?

Pourquoi le foreach de PHP avec passage par référence (&) modifie-t-il les éléments du tableau de manière inattendue ?

DDD
Libérer: 2024-12-11 04:41:09
original
433 Les gens l'ont consulté

Why does PHP's foreach with pass-by-reference (&) change array elements unexpectedly?

PHP Pass by Reference dans Foreach

En PHP, les variables peuvent être soit des variables normales, soit des variables de référence. Lors de l'attribution d'une référence d'une variable à une autre variable, cette dernière devient une variable de référence, se liant essentiellement au même emplacement mémoire que l'originale. Ce comportement a des implications lors de l'utilisation de la boucle foreach avec la syntaxe de passage par référence (&).

Considérez le code suivant :

$a = ['zero', 'one', 'two', 'three'];

foreach ($a as &$v) {

}

foreach ($a as $v) {
  echo $v . PHP_EOL;
}
Copier après la connexion

La sortie de ce code est :

zero one two two
Copier après la connexion

Pourquoi cela se produit-il ?

Dans la première boucle foreach, chaque élément de $a est affecté comme référence à la variable $v. Cela signifie que toute modification de $v modifie également l'élément correspondant dans $a.

Plus précisément, lors de la dernière itération de la première boucle, $v se voit attribuer la valeur de $a[3] (c'est-à-dire ' trois'). Cependant, cette affectation crée une relation de référence, donc $a[3] devient une variable de référence (même si elle n'est pas affectée explicitement à l'aide de &).

Dans la deuxième boucle foreach, les valeurs des éléments dans $ a sont imprimés. Cependant, puisque $a[3] est désormais une variable de référence, sa valeur change avec la valeur de $v. Lorsque $v reçoit la valeur « deux » lors de la troisième itération, $a[3] devient également « deux ».

En conséquence, lors de la dernière itération, $v (qui pointe toujours vers $a [3]) a la valeur « deux », et « deux » est imprimé. Cela explique pourquoi « deux » est répété dans la dernière itération, au lieu d'imprimer « trois » comme on pourrait s'y attendre intuitivement.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal