J'ai du mal à comprendre quand strtr
serait préférable à str_replace
ou vice versa. Il semble qu'il soit possible d'obtenir les mêmes résultats exacts en utilisant l'une ou l'autre fonction, bien que l'ordre dans lequel les sous-chaînes soient 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 sorties
YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring
Mis à part la syntaxe, y a-t-il un avantage à utiliser l'un sur l'autre? Y a-t-il des cas où l'on ne serait pas suffisant pour atteindre le résultat souhaité?
Première différence:
Un exemple intéressant d'un comportement différent entre strtr
et str_replace
est 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 que str_replace
est une approche plus globale des remplacements, tandis que strtr
traduit simplement les caractères un par un.
Une autre différence:
Étant donné le code suivant (tiré de Comparaison de la vitesse de remplacement des chaînes PHP ):
<?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:
chaîne (3) "PHP"
chaîne (27) "PHP: Hypertext Preprocessor"
La principale explication:
Cela se produit parce que:
strtr : il trie ses paramètres par longueur, en ordre décroissant, donc:
str_replace : cela fonctionne dans l'ordre de définition des clés, donc:
"PHP: Hypertext Preprocessor: Hypertext Preprocessor".
puis il trouve la clé suivante: "PHP: Hypertext Preprocessor" dans le texte résultant de l'étape précédente, il est donc remplacé par "PHP", ce qui donne comme résultat:
"PHP: Hypertext Preprocessor".
il n'y a plus de clés à rechercher, donc le remplacement s'arrête là.
Il semble qu'il soit possible d'obtenir exactement les mêmes résultats en utilisant l'une ou l'autre fonction
Ce n'est pas toujours vrai et dépend de la recherche et du remplacement des données que vous fournissez. Par exemple, lorsque les deux fonctions diffèrent, voir: PHP str_replace a-t-il une limite supérieure à 13 caractères?
strtr
ne remplacera pas dans les parties de la chaîne qui ont déjà été remplacées - str_replace
remplacera l'intérieur remplace.strtr
commencera par la touche la plus longue en premier si 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.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 par strtr
.
$string = "1.10.0001";
echo strtr($string, array("1" => "a", "10" => "b"));
// a.b.000a
voir: Php Manual Strtr .
Remarque dans le manuel STRTR-- Description string strtr (string $ str, string $ from, string $ to) string strtr (string $ str, array $ replace_pairs) Si trois arguments sont donnés, cette fonction renvoie un 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 N'effectue PAS le suivant, MAIS STR_REPLACE le fait.