Me está costando entender cuándo strtrsería preferible str_replaceo viceversa. Parece que es posible lograr exactamente los mismos resultados usando cualquiera de las funciones, aunque el orden en el que se reemplazan las subcadenas se invierte. 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');
Esto salidas
YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring
Aparte de la sintaxis, ¿hay algún beneficio en usar uno sobre el otro? ¿Algún caso en el que uno no sea suficiente para lograr el resultado deseado?
php
string
str-replace
strtr
andrewtweber
fuente
fuente

strtrpodría malinterpretarse fácilmente, yastrstrque es bastante diferente. Empiezo a pensar que soy disléxico. No cometeré ese error con str_replace.Respuestas:
Primera diferencia:
Un ejemplo interesante de un comportamiento diferente entre
strtry sestr_replaceencuentra en la sección de comentarios del Manual PHP:<?php $arrFrom = array("1","2","3","B"); $arrTo = array("A","B","C","D"); $word = "ZBB2"; echo str_replace($arrFrom, $arrTo, $word); ?>Para que esto funcione, use "strtr" en su lugar:
<?php $arr = array("1" => "A","2" => "B","3" => "C","B" => "D"); $word = "ZBB2"; echo strtr($word,$arr); ?>Esto significa que
str_replacees un enfoque más global para los reemplazos, mientras questrtrsimplemente traduce los caracteres uno por uno.Otra diferencia:
Dado el siguiente código (tomado de Comparación de velocidad de reemplazo de cadenas de 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); ?>Las líneas de texto resultantes serán:
La explicación principal:
Esto sucede porque:
strtr : ordena sus parámetros por longitud, en orden descendente, así:
str_replace : funciona en el orden en que se definen las claves, entonces:
luego encuentra la siguiente clave: "PHP: Preprocesador de hipertexto" en el texto resultante del paso anterior, por lo que se reemplaza por "PHP", que da como resultado:
no hay más llaves que buscar, por lo que el reemplazo termina ahí.
fuente
strtrno reemplazará el texto insertado por reemplazos anteriores.strtr('foo', array('oo' => 'ie', 'e' => 't'))devuelve en'fie'lugar de'fit'comostr_replacehace. Por lo tanto, aborda automáticamente el problema planteado por @Pies.Eso no siempre es cierto y depende de los datos de búsqueda y reemplazo que proporcione. Por ejemplo, si las dos funciones difieren, consulte: ¿PHP str_replace tiene un límite superior a 13 caracteres?
strtrno reemplazará en partes de la cadena que ya han sido reemplazadas -str_replacereemplazará el interior reemplaza.strtrcomenzará con la clave más larga primero en caso de que la llame con dos parámetros:str_replacese reemplazará de izquierda a derecha.str_replacepuede devolver el número de reemplazos realizados;strtrno ofrece ese valor de recuento.fuente
Creo que
strtrproporciona un reemplazo más flexible y condicional cuando se usa con dos argumentos, por ejemplo: si la cadena es 1, reemplácela con a, pero si la cadena es 10, reemplácela con b. Este truco solo podría lograrse mediantestrtr.$string = "1.10.0001"; echo strtr($string, array("1" => "a", "10" => "b")); // a.b.000aver: Php Manual Strtr .
fuente
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 del primero al último . ...
STRTR cada turno NO afecta al siguiente, PERO STR_REPLACE lo hace.
fuente