Quand utiliser strtr vs str remplacer?
j'ai du mal à comprendre quand strtr
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 de ces fonctions, bien que l'ordre dans lequel les substrats sont remplacés 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');
Ce sorties
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? Tous les cas où l'un ne serait pas suffisant pour atteindre un résultat souhaité?
4 réponses
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);
?>
- je m'attends comme résultat: "ZDDB"
- cependant, ce retour: "ZDDD" (Parce que B = D en fonction de notre tableau)
pour faire ce travail, utilisez "strtr" à la place:
<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>
- Cela renvoie: "ZDDB"
cela signifie que str_replace
est une approche plus globale pour les remplacements, tandis que strtr
traduit 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:
string (3) "PHP"
string (27) "PHP: Hypertext Preprocessor"
l'explication principale:
cela arrive parce que:
-
strtr : il trie ses paramètres par longueur, par ordre décroissant, ainsi:
- il donnera "plus d'importance" à la plus grande, et puis, comme le texte sujet est lui-même la plus grande clé du tableau de remplacement, il obtient traduit.
- comme tous les caractères du texte ont été remplacés, le processus s'arrête là.
-
str_replace : cela fonctionne dans l'ordre où les clés sont définies, so:
- il trouve la clé "PHP" dans le texte sujet et le remplace par: "PHP: préprocesseur hypertexte", ce qui donne comme résultat:
"PHP: Hypertext Preprocessor: Hypertext Preprocessor".
-
puis il trouve la touche suivante: "PHP: préprocesseur hypertexte" dans le texte résultant de la première étape, il est donc remplacé par "PHP", qui donne comme résultat:
"PHP: Hypertext Preprocessor".
-
il n'y a plus de clés à chercher, donc le remplacement s'arrête là.
- il trouve la clé "PHP" dans le texte sujet et le remplace par: "PHP: préprocesseur hypertexte", ce qui donne comme résultat:
il semble qu'il soit possible d'obtenir exactement les mêmes résultats en utilisant l'une ou l'autre de ces fonctions
ce n'est pas toujours vrai et dépend de la recherche et de remplacer les données que vous fournissez. Par exemple, lorsque les deux fonctions diffèrent, voir: est-ce que PHP str_replace a une limite supérieure à 13 caractères?
-
strtr
ne remplacera pas dans les parties de la chaîne qui ont déjà été remplacés -str_replace
remplacera à l'intérieur remplace. -
strtr
commence par la touche la plus longue au cas où vous l'appelleriez avec deux paramètres -str_replace
remplace de gauche à droite. -
str_replace
peut renvoyer le nombre de remplacements effectués -strtr
n'offre pas une telle valeur de nombre de.
je pense que strtr
fournit un remplacement plus souple et conditionnel lorsqu'il est utilisé avec deux arguments, par exemple: si string est 1, remplacer par a, mais si string est 10, remplacer par B. Ce truc ne pouvait être réalisé que par strtr
.
$string = "1.10.0001";
echo strtr($string, array("1" => "a", "10" => "b"));
// a.b.000a
voir : Manuel Php Strtr .
Avis en manuel STRTR-- Description string STR (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 search ou replace sont des tableaux, leurs éléments sont traités du premier au dernier . ...
STRTR each turn NOT effect to next, BUT STR_REPLACE does.