Assignations par référence

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Assignations par référence

par Arrays » 21 mai 2009, 19:32

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

par savageman » 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).

Assignations par référence

par Arrays » 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.