J'ai du mal à comprendre quand strtr
cela serait préférable str_replace
ou vice versa. Il semble qu'il soit possible d'obtenir exactement les mêmes résultats en utilisant l'une ou l'autre fonction, bien que l'ordre dans lequel les sous-chaînes sont remplacées soit inversé. Par exemple:
echo strtr('test string', 'st', 'XY')."\n";
echo strtr('test string', array( 's' => 'X', 't' => 'Y', 'st' => 'Z' ))."\n";
echo str_replace(array('s', 't', 'st'), array('X', 'Y', 'Z'), 'test string')."\n";
echo str_replace(array('st', 't', 's'), array('Z', 'Y', 'X'), 'test string');
Cette sortie
YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring
Mis à part la syntaxe, y a-t-il un avantage à utiliser l'un par rapport à l'autre? Y a-t-il des cas où l'un ne serait pas suffisant pour obtenir le résultat souhaité?
php
string
str-replace
strtr
andrewtweber
la source
la source
strtr
pourrait facilement être mal interprété carstrstr
ce qui est tout à fait différent. Je commence à penser que je suis dyslexique. Je ne ferai pas cette erreur avec str_replace.Réponses:
Première différence:
Un exemple intéressant d'un comportement différent entre
strtr
et sestr_replace
trouve dans la section commentaires du manuel PHP:<?php $arrFrom = array("1","2","3","B"); $arrTo = array("A","B","C","D"); $word = "ZBB2"; echo str_replace($arrFrom, $arrTo, $word); ?>
Pour que cela fonctionne, utilisez plutôt "strtr":
<?php $arr = array("1" => "A","2" => "B","3" => "C","B" => "D"); $word = "ZBB2"; echo strtr($word,$arr); ?>
Cela signifie qu'il
str_replace
s'agit d'une approche plus globale des remplacements, toutstrtr
en traduisant simplement les caractères un par un.Une autre différence:
Étant donné le code suivant (tiré de PHP String Replacement Speed Comparison ):
<?php $text = "PHP: Hypertext Preprocessor"; $text_strtr = strtr($text , array("PHP" => "PHP: Hypertext Preprocessor" , "PHP: Hypertext Preprocessor" => "PHP")); $text_str_replace = str_replace(array("PHP", "PHP: Hypertext Preprocessor") , array("PHP: Hypertext Preprocessor", "PHP") , $text); var_dump($text_strtr); var_dump($text_str_replace); ?>
Les lignes de texte résultantes seront:
La principale explication:
Cela se produit parce que:
strtr : il trie ses paramètres par longueur, par ordre décroissant, donc:
str_replace : il fonctionne dans l'ordre dans lequel les clés sont définies, donc:
puis il trouve la clé suivante: «PHP: Hypertext Preprocessor» dans le texte résultant de l'étape précédente, donc elle est remplacée par «PHP», ce qui donne comme résultat:
il n'y a plus de clés à rechercher, donc le remplacement s'arrête là.
la source
strtr
ne remplacera pas le texte inséré par les remplacements précédents.strtr('foo', array('oo' => 'ie', 'e' => 't'))
renvoie'fie'
au lieu de'fit'
comme lestr_replace
fait. Ainsi, il résout automatiquement le problème soulevé par @Pies.Ce n'est pas toujours vrai et dépend de la recherche et du remplacement des données que vous fournissez. Par exemple, là où les deux fonctions diffèrent, voir: PHP str_replace a-t-il une limite supérieure à 13 caractères?
strtr
ne remplacera pas les parties de la chaîne qui ont déjà été remplacées -str_replace
remplacera les remplacements intérieurs.strtr
commencera par la clé la plus longue en premier au cas où vous l'appelez avec deux paramètres -str_replace
remplacera de gauche à droite.str_replace
peut renvoyer le nombre de remplacements effectués -strtr
n'offre pas une telle valeur de comptage.la source
Je pense que
strtr
fournit un remplacement plus flexible et conditionnel lorsqu'il est utilisé avec deux arguments, par exemple: si la chaîne est 1, remplacez par a, mais si la chaîne est 10, remplacez par b. Cette astuce ne pouvait être réalisée que parstrtr
.$string = "1.10.0001"; echo strtr($string, array("1" => "a", "10" => "b")); // a.b.000a
voir: Php Manual Strtr .
la source
Remarque dans le manuel STRTR-- Description string strtr (string $ str, string $ from, string $ to) string strtr (string $ str, array $ replace_pairs) Si on lui donne trois arguments, cette fonction renvoie une copie de str où ...
STR_REPLACE-- ... Si la recherche ou le remplacement sont des tableaux, leurs éléments sont traités du premier au dernier . ...
STRTR à chaque tour PAS d'effet au suivant, MAIS STR_REPLACE le fait.
la source