Assignations par référence

Arrays
Invité n'ayant pas de compte PHPfrance

21 mai 2009, 16:22

Bonjour, j'ai un petit soucis de compréhension, en espérant que quelqu'un puisse m'aider à y voir plus clair.
Voila le code problématique :
<?php
$a = array(1,2,3,4);

foreach($a as &$v){
}
foreach($a as $v){
}
print_r($a);
?>
J'aimerais comprendre exactement pourquoi la dernière clef contient la valeur '3'.
La première boucle ne fait pas de modification dans le tableau. Toutefois, au moment où la boucle est terminée, $v est en fait une référence à $a[3]. Pas de problème de ce coté là. Ensuite dès que la seconde boucle commence, $v est maintenant affecté à chaque valeur de chaque élement du tableau. Cependant, $v est déjà reférencé à $a[3], et c'est ici que je ne comprends plus ce qu'il se passe. Dans l'attente de vos explications, bonne journée.

Eléphant du PHP | 185 Messages

21 mai 2009, 19:06

A la fin du premier foreach() $v contient une référence vers $a[3].

Lors du deuxième foreach, voici ce qu'il se passe :
$v = $a[0]; // = 1
$v = $a[1]; // = 2
$v = $a[2]; // = 3
$v = $a[3]; // = 3 aussi car $a[3] = $v et que $v = $a[2] = 3

On peut aussi le voir de cette façon :
$a[3] = $a[0];
$a[3] = $a[1];
$a[3] = $a[2];
$a[3] = $a[3]; // donc $a[3] = $a[2]

Pour corriger le problème, rien de plus simple : unset($v) entre les 2 foreach() ou bien encore ne pas passer la référence dans le foreach... (dépendant de ce que tu fais).

Arrays
Invité n'ayant pas de compte PHPfrance

21 mai 2009, 19:32

Merci pour cette réponse. J'ai parfaitement compris maintenant. Encore merci :wink: