Maison >développement back-end >tutoriel php >Une brève discussion sur les pièges liés à l'utilisation de variables de référence dans foreach en PHP

Une brève discussion sur les pièges liés à l'utilisation de variables de référence dans foreach en PHP

高洛峰
高洛峰original
2017-01-03 14:42:101365parcourir

J'écris du PHP depuis de nombreuses années, mais je fais encore des erreurs stupides. Aujourd'hui, j'ai rencontré un piège lors du référencement des variables dans foreach. La version PHP est la 5.6.12. Le code est le suivant :

<?php
$arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
foreach ($arr as $i=>&$a) {
  $a = $a.&#39;_&#39;. $a;
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
foreach ($arr as $i=>$a) {
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
print_r($arr);
.

Résultats de sortie

Une brève discussion sur les pièges liés à lutilisation de variables de référence dans foreach en PHP

Quand j'ai vu pour la première fois le résultat de sortie du deuxième foreach, je me suis senti très dérouté. Comment deux d_d pouvaient-ils être générés ?

Après y avoir bien réfléchi, il s'avère que, comme la portée de $a en PHP foreach est une variable locale de la fonction entière, elle est toujours valide en dehors de la boucle, plutôt que d'être enfermée dans la boucle,

Ainsi, lorsque le deuxième foreach est exécuté, $a n'est pas une nouvelle variable, mais pointe toujours vers la référence d'adresse du cinquième élément du tableau $arr

Lorsque le deuxième foreach est. en boucle, c'est en fait dans Continuer à attribuer des valeurs au 5ème élément du tableau $arr,

La situation d'affectation spécifique,

La première fois : a_a est affecté au 5ème élément, le résultat est : [a_a, b_b, c_c, d_d,a_a]

La deuxième fois : b_b est affecté au cinquième élément, le résultat est : [a_a, b_b, c_c, d_d,b_b]

La troisième fois : c_c est attribué au 5ème élément, le résultat est : [a_a, b_b, c_c, d_d,c_c]

La quatrième fois : d_d est attribué au 5ème élément, le résultat est : [a_a, b_b, c_c, d_d, d_d]

La cinquième fois : À ce moment, parce que le cinquième élément est devenu d_d, d_d est à nouveau affecté au cinquième élément, et le résultat est still : [a_a, b_b, c_c, d_d,d_d]

Solution :

1. Essayez de ne pas utiliser le même nom de variable de boucle

2. $a); après chaque utilisation ou avant de l'utiliser à nouveau. Déverrouillez l'application d'adresse

ou utilisez l'exemple de code ci-dessus :

$arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
foreach ($arr as $i=>&$a) {
  $a = $a.&#39;_&#39;. $a;
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
echo $a;
echo &#39;<hr>&#39;;
 
// 这里 unset 掉
unset($a);
 
echo $a = &#39;ccc&#39;;
echo &#39;<hr>&#39;;
print_r($arr);
echo &#39;<hr>&#39;;
foreach ($arr as $i=>$a) {
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
print_r($arr);

Résultat de sortie :

Une brève discussion sur les pièges liés à lutilisation de variables de référence dans foreach en PHP

Maintenant, c'est normal, ces petits détails, assurez-vous de faire attention

Ce qui précède est une brève discussion de l'éditeur sur les pièges de l'utilisation de variables de référence dans foreach en PHP. J'espère que vous soutiendrez le. Site Web PHP chinois ~

Plus Une brève discussion sur les pièges de l'utilisation de variables de référence dans foreach en PHP Pour les articles connexes, veuillez faire attention au site Web PHP 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