Me está costando entender cuándo strtr
sería preferible str_replace
o 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
strtr
podría malinterpretarse fácilmente, yastrstr
que 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
strtr
y sestr_replace
encuentra 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_replace
es un enfoque más global para los reemplazos, mientras questrtr
simplemente 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
strtr
no reemplazará el texto insertado por reemplazos anteriores.strtr('foo', array('oo' => 'ie', 'e' => 't'))
devuelve en'fie'
lugar de'fit'
comostr_replace
hace. 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?
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 llame con dos parámetros:str_replace
se reemplazará de izquierda a derecha.str_replace
puede devolver el número de reemplazos realizados;strtr
no ofrece ese valor de recuento.fuente
Creo que
strtr
proporciona 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.000a
ver: 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