web-dev-qa-db-fra.com

Quand utiliser strtr vs str_replace?

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

80
andrewtweber

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'attendrais comme résultat: "ZDDB"
  • Cependant, ce retour: "ZDDD" (Parce que B = D selon notre tableau)

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 renvoie: "ZDDB"

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:

    1. il donnera "plus d'importance" au plus grand, puis, comme le texte sujet est lui-même la plus grande clé du tableau de remplacement, il est traduit.
    2. parce que tous les caractères du texte sujet ont été remplacés, le processus s'arrête là.
  • str_replace : cela fonctionne dans l'ordre de définition des clés, donc:

    1. il trouve la clé "PHP" dans le texte du sujet et le remplace par: "PHP: Hypertext Preprocessor", ce qui donne comme résultat:

      "PHP: Hypertext Preprocessor: Hypertext Preprocessor".

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

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

127
Nicolás Ozimica

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.
18
hakre

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 .

5
Arif RH

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.

1
Null None