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
Mary-Kate Olsenoriginal
2024-12-27 14:37:14325parcourir

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);

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
)

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) { }

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