[PHP] 'tit bug str_replace

Fermé
Burnyfighter - 16 mai 2008 à 00:31
macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 - 19 mai 2008 à 16:39
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 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
16 mai 2008 à 10:03
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
16 mai 2008 à 17:50
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 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
19 mai 2008 à 16:39
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