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é?

69
demandé sur andrewtweber 2011-11-18 07:13:51

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:

    1. 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.
    2. 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:

    1. 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".

    2. 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".

    3. il n'y a plus de clés à chercher, donc le remplacement s'arrête là.

109
répondu Nicolás 2015-08-09 02:01:09

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.
16
répondu hakre 2017-05-23 11:54:43

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 .

4
répondu Arif RH 2015-08-31 14:29:07

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.

1
répondu Null None 2012-09-18 21:30:33