Cuándo usar strtr vs str_replace?

Estoy teniendo dificultades para 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:

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

Estas salidas

 YeXY XYring YeZ Zring YeXY XYring YeZ Zring 

Además de la syntax, ¿hay algún beneficio al usar uno sobre el otro? ¿Algún caso donde uno no sería suficiente para lograr un resultado deseado?

Primera diferencia:

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

  
  • Esperaría como resultado: “ZDDB”
  • Sin embargo, este retorno: “ZDDD” (Porque B = D según nuestra matriz)

Para que esto funcione, use “strtr” en su lugar:

  "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 a uno.


Otra diferencia:

Dado el siguiente código (tomado de PHP String Replacement Speed ​​Comparison ):

  "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 de texto resultantes serán:

cadena (3) “PHP”
string (27) “PHP: preprocesador de hipertexto”


La principal explicación:

Esto sucede porque:

  • strtr : ordena sus parámetros por longitud, en orden descendente, por lo que:

    1. le dará “más importancia” al 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 en que se definen las claves, entonces:

    1. encuentra la clave “PHP” en el texto del tema y lo reemplaza con: “PHP: preprocesador de hipertexto”, lo que da como resultado:

      “PHP: preprocesador de hipertexto: preprocesador de hipertexto”.

    2. luego encuentra la siguiente clave: “PHP: preprocesador de hipertexto” en el texto resultante del paso anterior, por lo que se reemplaza por “PHP”, lo que da como resultado:

      “PHP: preprocesador de hipertexto”.

    3. no hay más llaves que buscar, por lo que el reemplazo termina allí.

Parece que es posible obtener exactamente los mismos resultados usando cualquiera de las funciones

Eso no siempre es cierto y depende de la búsqueda y reemplazo de los datos que brinde. Por ejemplo, donde las dos funciones difieren, ver: ¿PHP str_replace tiene un límite superior a 13 caracteres?

  • strtr no reemplazará en partes de la cadena que ya han sido reemplazadas – str_replace reemplazará el interior reemplaza.
  • strtr comenzará con la clave más larga primero en caso de que la strtr 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.

Creo que strtr proporciona un reemplazo más flexible y condicional cuando se usa con dos argumentos, por ejemplo: si string es 1, reemplace con a, pero si string es 10, reemplace con b. Este truco solo se puede lograr con strtr .

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

ver: Php Manual Strtr .

Aviso en el manual STRTR– Descripción string strtr (string $ str, string $ from, string $ to) string strtr (string $ str, array $ replace_pairs) Si se le dan tres argumentos, esta función devuelve una copia de str donde …

STR_REPLACE– … Si buscar o reemplazar son matrices, sus elementos se procesan de principio a fin . …

STRTR cada turno NO afecta al siguiente, PERO STR_REPLACE lo hace.