Maison > développement back-end > tutoriel php > Pourquoi la boucle Foreach de PHP avec des références écrase-t-elle le dernier élément du tableau ?

Pourquoi la boucle Foreach de PHP avec des références écrase-t-elle le dernier élément du tableau ?

Mary-Kate Olsen
Libérer: 2024-12-27 14:37:14
original
313 Les gens l'ont consulté

Why Does PHP's Foreach Loop with References Overwrite the Last Array Element?

Comportement inattendu de la boucle Foreach à l'aide de références

Lors de l'utilisation de la boucle foreach de PHP avec des références, un comportement étrange peut se produire, comme le démontre l'extrait de code suivant :

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

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

print_r($a);
Copier après la connexion

Ce code est destiné à parcourir le tableau $a en utilisant une variable de référence $v dans la première boucle et une variable non-référence $v dans la deuxième boucle. Cependant, de manière surprenante, le résultat montre que le dernier élément du tableau, 'd', a été écrasé :

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

Explication du comportement

Cette inattendue le comportement est bien documenté dans la documentation de PHP. Il avertit que lors de l'utilisation de références dans une boucle foreach, la référence du dernier élément du tableau reste même après la fin de la boucle. Pour éviter ce problème, il est recommandé de supprimer la variable de référence à l'aide d'unset().

Dans notre exemple, la variable de référence $v reste une référence au dernier élément de $a après la première boucle. Lorsque la deuxième boucle parcourt $a, chaque itération de la boucle réaffecte la valeur à $v. Cependant, puisque $v est une référence au dernier élément de $a, il écrase la valeur de cet élément.

Guide étape par étape du comportement

Pour clarifier davantage, voici un guide étape par étape de ce qui se passe dans notre extrait de code :

  1. La première boucle foreach attribue des références à chaque élément du tableau à $v.
  2. Dans la deuxième boucle foreach, $v fait toujours référence au dernier élément de $a, 'd'.
  3. La boucle parcourt $a , en réaffectant chaque valeur à $v.
  4. Puisque $v est une référence au dernier élément de $a, il écrase la valeur de cet élément avec chaque itération.
  5. Le dernier élément de $a finit par être écrasé par la valeur de l'élément précédent.

Solution

À éviter ce problème, supprimez simplement la variable de référence $v après la première boucle :

foreach ($a as &$v) { }
unset($v);
foreach ($a as $v) { }
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