[Resolu] Problème Foreach

devlop78
Invité n'ayant pas de compte PHPfrance

15 mai 2010, 02:09

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
Modifié en dernier par devlop78 le 17 mai 2010, 11:56, modifié 1 fois.

ViPHP
fab
ViPHP | 2657 Messages

15 mai 2010, 15:44

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.
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

devlop78
Invité n'ayant pas de compte PHPfrance

16 mai 2010, 02:16

<?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.

devlop78
Invité n'ayant pas de compte PHPfrance

16 mai 2010, 02:21

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 ... :'(

devlop78
Invité n'ayant pas de compte PHPfrance

17 mai 2010, 11:56

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 ...