Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/03/2008, 12h16   #1
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 598
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 598
Points : 123
Points : 123
Par défaut [Tableaux] Portée d'une variable ?

Bonjour,

J'ai repris l'exemple du manuel php qui modifie les valeurs
d'un tableau durant un foreach en passant la référence du
tableau (&), ce qui permet de travailler sur le tableau
lui-même et non pas sur sa copie.
Code :
1
2
3
4
5
 
$arr = array(1, 2, 3, 4);
 
foreach($arr as &$value)
  $value = $value * 2;
avec un print_r($arr) j'ai bien les résultats attendus:
Code :
1
2
 
Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 )
mais là où ça me perturbe c'est lorsque je liste le tableau
avec un foreach:
Code :
1
2
3
 
foreach($arr as $value) 
    echo $value." ";
cela donne:

Après quelques essaies il s'avère qu'en changeant le nom de
la variable :
Code :
1
2
3
 
foreach($arr as $val) 
    echo $val." ";
ça fonctionne.

Ce que je ne comprends plus c'est la portée d'une variable en PHP.
Normalement $value n'est accessible que dans le 1er bloc foreach non ?
Donc si je nomme ma variable $value dans le 2eme foreach il ne
devrait pas y avoir de pb.

Quelqu'un pourrait m'éclairer ?

Merci
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 12h41   #2
Membre éprouvé
 
Développeur Web
Inscription : avril 2005
Messages : 395
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 395
Points : 479
Points : 479
Salut, c'est un grand classique !

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
$arr = array('un', 'deux', 'trois');
foreach($arr as &$value)
  $value = $value.'+zero';
 
print_r($arr);
/*Array
(
    [0] => un+zero
    [1] => deux+zero
    [2] => trois+zero
)*/
 
foreach($arr as $value)
{
 
}
print_r($arr);
/*Array
(
    [0] => un+zero
    [1] => deux+zero
    [2] => deux+zero
)*/
L'explication :
Dans la dernière boucle (avec référence) la référence est gardé sur le dernier élément du tableau.
On commence la seconde boucle (sans référence cette fois),
On appel $value (avec valeur d'origine) mais pendant qu'on appel value on continue de modifier la référence sur le dernier élément, ce qui donne :
1er appel $value = un+zero donc la référence (du dernier indice)=> un+zero
2eme appel $value = deux+zero donc la référence (du dernier indice)=> deux+zero
3eme appel $value = deux+zero donc la référence (du dernier indice)=> deux+zero

Pourquoi la référence sur $value influe sur le tableau $ar ?
$value représente un indice de $arr
pendant le foreach : $value = $arr[n]
__________________
Zend PHP5 Certification
MySQL 4 Core Certification
Gats est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 12h59   #3
Membre émérite
 
Inscription : septembre 2007
Messages : 951
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 951
Points : 948
Points : 948
Ta question est tres interresante, ta variable $value n'est pas réinitialisée, dans la mesure ou tu utilises un passage par reference. Php conserve des informations sur cette variable meme apres la boucle. Il faut utiliser un unset($value) juste apres ton tableau pour briser la reference.
batataw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 16h02   #4
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 598
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 598
Points : 123
Points : 123
Merci à vous 2 pour ces trèèès précieuses informations.

Toutefois quelque chose m'inquiète.
Si j'utilise un passage par référence dans une fonction par ex:
Code :
1
2
3
4
5
 
function incrementer(&$value)
{
  $value = $value + 1;
}
Est ce que cela signifie que dans le code toute les variables ultérieures
nommées $value seront affectées par la référence ?
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 16h24   #5
Membre éprouvé
 
Développeur Web
Inscription : avril 2005
Messages : 395
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 395
Points : 479
Points : 479
Les fonctions qui utilisent un paramètre par référence permettent justement de modifier une variable sans pour autant utilisé le mot clé global ou encore retourner une valeur grâce au return.
Code php :
1
2
3
4
5
6
7
8
9
 
function incrementer(&$value)
{
  $value++;
}
 
$i= 0;
incrementer($i);
echo $i; // 1
__________________
Zend PHP5 Certification
MySQL 4 Core Certification
Gats est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 16h47   #6
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 598
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 598
Points : 123
Points : 123
Je suis bien d'accord, mais ça ne répond pas à ma question.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 16h52   #7
Membre éprouvé
 
Développeur Web
Inscription : avril 2005
Messages : 395
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 395
Points : 479
Points : 479
pour reprendre l'exemple simple :
Code :
1
2
3
4
5
6
7
8
9
10
 
function incrementer(&$value)
{
  $value++;
}
 
$i= 0;
echo $i; // 0
incrementer($i);
echo $i; //
Si je comprends bien ta question tu demandes si la valeur de $i avant l'appel de la fonction changera.
Non la valeur ne changera pas.
__________________
Zend PHP5 Certification
MySQL 4 Core Certification
Gats est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 17h11   #8
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 598
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 598
Points : 123
Points : 123
Non, je demande si par ex plus loin dans le code je créé une variable
nommée $value, est ce que cette variable (à l'instar du pb rencontré
avec les 2 foreach) sera affecté par la référence utilisée avec
l'argument $value de incrementer(&$value) ?
En clair est ce que je doit faire un unset() avant d'utiliser
une nouvelle variable $value ?
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 17h30   #9
Membre éprouvé
 
Développeur Web
Inscription : avril 2005
Messages : 395
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 395
Points : 479
Points : 479
La variable sera modifier seulement si tu rappels la fonction avec cette même variable.
__________________
Zend PHP5 Certification
MySQL 4 Core Certification
Gats est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 17h34   #10
Membre émérite
 
Inscription : septembre 2007
Messages : 951
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 951
Points : 948
Points : 948
Non tu n'as pas besoin de faire de unset, ce cas concerne juste le foreach.
Ta valeur $value n'est visbile que dans ta fonction.
batataw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 17h49   #11
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 598
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 598
Points : 123
Points : 123
D'accord ! C'est ce que je voulais savoir

Merci
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h01.


 
 
 
 
Partenaires

Hébergement Web