[PHP] 'tit bug str_replace

Burnyfighter -  
macgawel Messages postés 676 Statut Membre -
Bonjour,

Je rencontre un petit problème avec STR_REPLACE sur un array.

Un peu de code sera plus clair :
$find=array(61,161);
$replace=array(5,6);
$string=array(59,60,61,159,160,161,162);
print_r(str_replace($find,$replace,$string));

et j'obtiens le résultat suivant :
Array (
[0] => 59
[1] => 60
[2] => 5
[3] => 159
[4] => 160
[5] => 15
[6] => 162 )

En bref la fonction commence par remplacer 61 par 5 (c'est normal) mais remplace aussi la partie '61' de 161 par 5-> 161 est donc transformé en 15 et ne passe pas à 6.

Quelqu'un connait-il une astuce pour éviter ce désagréement ???

Merci d'avance
A voir également:

2 réponses

macgawel Messages postés 676 Statut Membre 89
 
Bonjour.

Il n'y a pas de bug, il n'y a qu'une "mauvaise" utilisation de la fonction...

Tu peux essayer avec $find=array(161,61); , ça devrait marcher. Je crois que str_replace lit le tableau $find dans l'ordre, donc en commençant par la chaîne la plus longue, ça devrait passer.

Mais si tu as 1611 dans ton $string, ton résultat sera faux :
1. On remplace le 161 par 6 : 1611 => 61
2. On remplace 61 par 5 : 61 => 5
Ca dépend de ce que tu veux faire, mais il faudrait trouver autre chose. Au minimum, utilise des expressions réguilères.
0
burnyfighter
 
Merci pour cette réponse,

je me doutais bien qu'il ne s'agissait pas d'un bug, mais je pensait que str_replace ferait un remplacement par valeur entière (vu qu'ici il s'agit d'entiers) mais en fait il interprète cet entier comme un string (d'ou le STR replace).

Maintenant le souci que je rencontre est qu'en fait mes données ne sont pas ordonnées par ordre croissant et que j'ignore leur valeur vu que c'est un traitement automatique à partir de la BDD.

Je reste toutefois preneur d'une quelconque solution !
0
macgawel Messages postés 676 Statut Membre 89
 
Utilise la fonction preg_replace.

De tête, je dirais que le masque à utiliser est ("/^61/$", "/^161/$") ...
le /^ sert à indiquer le début de la chaîne, /$ la fin de la chaîne. Donc en encadrant les nombres que tu recherches comme ça, tu devrait te limiter aux correspondances exactes.
0