2011-11-18 20 views
65

Me está costando entender cuándo strtr sería preferible a str_replace o viceversa. Parece que es posible obtener exactamente los mismos resultados utilizando cualquiera de las funciones, aunque se invierte el orden en que se reemplazan las subcadenas. Por ejemplo:Cuándo usar strtr vs str_replace?

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'); 

Esto da salida a

YeXY XYring 
YeZ Zring 
YeXY XYring 
YeZ Zring 

Aparte de sintaxis, ¿hay algún beneficio de usar uno sobre el otro? ¿Algún caso donde uno no sería suficiente para lograr un resultado deseado?

+3

Desde el punto de vista de legibilidad, 'strtr' fácilmente podría interpretarse erróneamente como' strstr' que es bastante diferente. Estoy empezando a pensar que soy disléxico. No cometerá ese error con str_replace. – Programster

Respuesta

104

primera diferencia:

Un ejemplo interesante de un comportamiento diferente entre strtr y str_replace se encuentra en la sección de comentarios del Manual de PHP:

<?php 
$arrFrom = array("1","2","3","B"); 
$arrTo = array("A","B","C","D"); 
$word = "ZBB2"; 
echo str_replace($arrFrom, $arrTo, $word); 
?> 
  • que se puede esperar como resultado : "ZDDB"
  • Sin embargo, este retorno: "ZDDD" (Porque e B = D de acuerdo con nuestra matriz)

para hacer este trabajo, utilizan "strtr" en su lugar:

<?php 
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D"); 
$word = "ZBB2"; 
echo strtr($word,$arr); 
?> 
  • Esto devuelve: "zDDB"

Esto significa que str_replace es un enfoque más global para los reemplazos, mientras que strtr simplemente traduce los caracteres uno por uno.


Otra diferencia:

Dado el siguiente código (tomado 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); 
?> 

Las líneas resultantes de texto será:

cadena (3) "PHP"
cadena (27) "PHP: Hypertext Preprocessor"


La principal explicación:

Esto sucede porque:

  • strtr: ordena sus parámetros de longitud, en orden descendente , entonces:

    1. dará "más importancia" a la más grande, y luego, como el texto del tema es en sí mismo la clave más grande de la matriz de reemplazo, se traduce.
    2. porque todos los caracteres del texto del tema han sido reemplazados, el proceso finaliza allí.
  • str_replace: funciona en el orden de las teclas se definen, por lo que:

    1. se encuentra la tecla “PHP” en el texto del asunto y lo sustituye por: “PHP: Hypertext Preprocessor ", Lo que da como resultado:

      " PHP: preprocesador de hipertexto: preprocesador de hipertexto ".

    2. entonces se encuentra la clave siguiente: “PHP: Hypertext Preprocessor” en el texto resultante de la etapa anterior, por lo que es reemplazado por "PHP", lo que da como resultado:

      “ PHP: preprocesador de hipertexto ".

    3. no hay más llaves que buscar, por lo que la sustitución termina allí.

+1

Ah ok gracias! No me di cuenta de que strtr estaba traduciendo por longitud, pensé que estaba en el orden inverso. – andrewtweber

+0

Como se documenta en php.net, la función str_replace tiene 1 parámetro más llamado "count" para indicar el tiempo que debe realizar la sustitución. Pero no puedo usar este parámetro de todos modos. Alguien sabe por qué ? –

+1

@ vantrung-cuncon Para eso no es ese parámetro. Los documentos dicen: "Esto se establecerá en la cantidad de reemplazos realizados". Tendrá que buscar otra solución si quiere limitar str_replace a una cierta cantidad de reemplazos. – jdhartley

14

Parece que es posible lograr los mismos resultados utilizando cualquiera de las funciones

Esto no siempre es cierto y depende de la búsqueda y reemplazar los datos que proporcione. Por ejemplo, cuando los dos funciones difieren de ver: Does PHP str_replace have a greater than 13 character limit?

  • strtr no sustituirá en algunas partes de la cadena que ya han sido reemplazados - str_replace reemplazará el interior reemplaza.
  • strtr comenzará primero con la tecla más larga en caso de que la llame con dos parámetros: str_replace reemplazará de izquierda a derecha.
  • str_replace puede devolver el número de reemplazos realizados - strtr no ofrece dicho valor de recuento.
4

creo strtr proporciona reemplazo más flexible y condicional cuando se utiliza con dos argumentos, por ejemplo: si la cadena es 1, reemplazar con una, pero si la cadena es de 10, reemplace con b. Este truco solo pudo ser logrado por strtr.

$string = "1.10.0001"; 
echo strtr($string, array("1" => "a", "10" => "b")); 
// a.b.000a 

ver: Php Manual Strtr.

1

Aviso en el manual STRTR-- Descripción strtr cadena (string $ cadena, $ cadena de, cadena $ a) cadena strtr (cadena $ cadena, array $ replace_pairs) Si se les da tres argumentos, declaraciones de esta función una copia de str , donde ...

STR_REPLACE-- ... Si la búsqueda o reemplazar son matrices, sus elementos se procesan primero hasta el último. ...

strtr cada NO gire a efectuar a continuación, pero str_replace hace.

Cuestiones relacionadas