3 votes

Changer de texte avec str_replace et les tableaux

Voici quelque chose d'intéressant que je viens de découvrir concernant str_replace(). Dans ma fonction, j'ai besoin de faire deux requêtes mysql qui sont les mêmes avec un léger changement sur le tri du résultat. Comme argument, j'obtiens une chaîne de caractères contenant une clause d'ordre, par exemple 'nom de famille ASC' mais cela pourrait aussi être 'nom de famille DESC'. Je voulais passer facilement au tri inverse en utilisant str_replace et j'ai pensé que cela ferait l'affaire :

str_replace(array('ASC', 'DESC'), array('DESC', 'ASC'), $subject)

Dans mon esprit, il devrait remplacer toutes les occurrences de ASC par DESC et toutes les occurrences de DESC par ASC. Puisque la chaîne de caractères ne contient qu'un seul de ces deux éléments, je devrais obtenir une clause d'ordre inversé. Cependant, ce n'est pas le cas. Le résultat du code ci-dessus est la même chaîne.

J'ai fait quelques tests et il s'est avéré que ces appels font ce que vous voulez qu'ils fassent :

str_replace('ASC', 'DESC', $subject)
str_replace(array('ASC'), array('DESC'), $subject)

A mon avis, c'est bizarre parce que

array('ASC', 'DESC') != array('DESC', 'ASC')

Pourquoi alors PHP considérerait-il cela comme égal ? Existe-t-il un autre moyen de faire ce type de remplacement facilement ?

4voto

Jon Points 194296

Dans ce scénario, vous pouvez utiliser strtr comme ça :

strtr($subject, array('ASC' => 'DESC', 'DESC' => 'ASC'));

Cela fonctionnera parce que

Si deux arguments sont donnés, le second doit être un tableau de la forme array('from' => 'to', ...) . La valeur de retour est une chaîne où toutes les occurrences des clés du tableau ont été remplacées par les valeurs correspondantes. correspondantes. Les clés les plus longues seront essayées en premier. Une fois qu'une sous-chaîne a été remplacée, sa nouvelle valeur ne sera pas recherchée à nouveau.

Voyez-le en action .

Avec str_replace ce qui se passe, comme vous l'avez déjà découvert, c'est que d'abord ASC est remplacé par DESC et ensuite DESC est replacé en ASC pour un grand total de rien fait.

3voto

Jon Points 4637

PHP "rend" le premier paramètre en premier, en changeant toutes les occurrences de la manière que vous voulez (toutes les ASC réglé sur DESC ).

Mais ensuite vous passez le second paramètre en disant de faire le contraire, donc tout DESC sont réglés sur ASC ce qui revient à annuler le premier paramètre.

0voto

KingCrunch Points 45168

En fait, je devine juste : les remplacements sont consécutifs. Cela signifie qu'il remplace d'abord ASC avec DESC et ensuite DESC avec ASC ce qui aura pour effet de reproduire la même chaîne de caractères.

Mise à jour : Il semble que j'aie raison.

php > $a = 'I am a string';
php > var_dump(str_replace(array('am', 'is'), array('is', 'k'), $a));
string(12) "I k a string"

Il remplace d'abord am avec is (la première entrée) et ensuite is avec k

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X