Page 1 sur 1

[Resolu] Problème Foreach

Posté : 15 mai 2010, 02:09
par devlop78
Bonjour

J'ai un problème avec

foreach ($items as $key=>&$value) {
$value = preg_replace("/$q/i",'<strong>$0</strong>',$value);
}

Et ce n'est pas la première fois que j'ai ce problème. Les deux derniers éléments (dans ce cas), sont identiques. Il modifie mal mon tableau. Alors que

foreach ($items as $key=>$value) {
$items[$key] = preg_replace("/$q/i",'<strong>$0</strong>',$value);
}

Me donne un tableau respecté. Quelqu'un sait-il pourquoi ? Est-ce le même problème pour les fonctions avec arguments précédés de & ?

merci

Re: Problème Foreach

Posté : 15 mai 2010, 15:44
par fab
Tu sais à quoi sert le & ?
C'est le passage par référence d'une variable, or dans ce cas présent tu créé une variable $value à chaque itération de ta boucle, cette variable n'est pas pré-existante à ta boucle, utiliser le passage par référence me semble donc être un non-sens qui bien que syntaxiquement soit correct ne peut que provoquer des comportements inattendus.

Re: Problème Foreach

Posté : 16 mai 2010, 02:16
par devlop78
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr vaut maintenant array(2, 4, 6, 8)
unset($value); // Stop la référence sur le dernier élément
?>
D'après la documentation on a le tableau qui est modifié. Or dans mon exemple, mon tableau par la suite était modifié mais pas comme il fallait. Le code délivre par la suite un code JSON qui donne par exemple VAR1 VAR2 VAR2 au lieu de donner VAR1 VAR2 VAR3.

J'ai d'ailleurs eu un moment le même problème dans une fonction où je faisais :

fonction x (&arg) {
unset ($arg);
}

Ceci ne fait ... rien. Alors que :

fonction x (&arg) {
$arg = '';
}

fonctionne. La fonction qui appelle cette fonction a bien comme variable $arg locale une variable vide dans le second cas, alors que la variable n'a pas bougé d'un poil dans le premier. Je me suis dit pour ça (j'avais d'autres problèmes que de lire la doc à ce moment) que le unset ne pouvait se faire vu que c'était une référence.

Re: Problème Foreach

Posté : 16 mai 2010, 02:21
par devlop78

Code : Tout sélectionner

<?php $mavar = array('un', 'deux', 'trois'); foreach($mavar as &$value) { $value .= "br "; // je ne mets pas les ouverture et fermeture de balise sur ce forum car il me change mon br en saut de ligne ici même ... Mais ça ne change rien pour la suite. } foreach($mavar as $value) { echo $value; } ?>
Me donne :
un
deux
deux
Tu trouve pas que quelque chose cloche ? Je suis sous WAMP SERVER, et franchement si on me dit que c'est un bug de ce serveur, je pète un câble, car déjà je galère pour que mes sites soient compatibles IE, Firefox, etc, si en plus les serveurs interprètes différemment un simple foreach ... :'(

Re: Problème Foreach

Posté : 17 mai 2010, 11:56
par devlop78
Hmmmm ....

Deux solutions ici

Code : Tout sélectionner

<?php $mavar = array('un', 'deux', 'trois'); foreach($mavar as &$value) { $value .= "<br />"; } foreach($mavar as $value2) { echo $value2; } ?>
Ou utiliser unset($value) comme le préconnise la documentation après le foreach. bref $mavar[$key] restera ma préférée ...