82 votes

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

Outre la syntaxe, y a-t-il un avantage à utiliser l'un ou l'autre ? Y a-t-il des cas où l'un des deux ne suffirait pas à obtenir le résultat souhaité ?

129voto

Nicolás Points 2418

Première différence :

Un exemple intéressant de différence de comportement entre strtr y str_replace se trouve dans la section des 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'attendais à ce résultat : "ZDDB"
  • Cependant, ce retour : "ZDDD" (Parce que B = D selon notre tableau)

Pour que cela fonctionne, 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 des remplacements, tandis que strtr traduit simplement les caractères un par un.


Autre différence :

Étant donné le code suivant (tiré de Comparaison de la vitesse de remplacement des chaînes de caractères en 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 qui en résultent sont les suivantes :

string(3) "PHP"
string(27) "PHP : préprocesseur hypertexte"


L'explication principale :

Cela se produit parce que :

  • strtr Il classe ses paramètres par longueur, dans l'ordre décroissant, de sorte que :

    1. il accordera "plus d'importance" à la clé la plus grande, puis, comme le texte du sujet est lui-même la clé la plus grande du tableau de remplacement, il sera traduit.
    2. parce que tous les caractères du texte du sujet ont été remplacés, le processus s'arrête là.
  • str_replace Le système fonctionne dans l'ordre dans lequel les clés sont définies :

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

      "PHP : Préprocesseur hypertexte : Hypertext Preprocessor".

    2. puis il trouve la clé suivante : "PHP : Hypertext Preprocessor" dans le texte résultant de l'étape précédente, qui est donc remplacé par "PHP", ce qui donne le résultat suivant :

      "PHP : Préprocesseur hypertexte".

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

18voto

hakre Points 102271

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 cela dépend des données de recherche et de remplacement que vous fournissez. Pour des exemples où les deux fonctions diffèrent, voir : Est-ce que PHP str_replace a 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 l'intérieur remplace.
  • strtr commencera par la clé la plus longue 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.

6voto

Arif RH Points 115

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 : Manuel Php Strtr .

2voto

Null None Points 11

Avis 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 un copie de str où ...

STR_REPLACE-- ... Si search ou replace sont des tableaux, leurs éléments sont traités du premier au dernier . ...

STRTR à chaque tour n'a PAS d'effet sur le tour suivant, MAIS STR_REPLACE en a un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X