Primera diferencia:
Un ejemplo interesante de un comportamiento diferente entre strtr
y se str_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);
?>
- 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:
<?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 que strtr
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:
cadena (3) "PHP"
cadena (27) "PHP: Preprocesador de hipertexto"
La explicación principal:
Esto sucede porque:
strtr : ordena sus parámetros por longitud, en orden descendente, así:
- le dará "más importancia" al más grande, y luego, como el texto del asunto es en sí mismo la clave más grande de la matriz de reemplazo, se traduce.
- debido a que todos los caracteres del texto del tema han sido reemplazados, el proceso termina ahí.
str_replace : funciona en el orden en que se definen las claves, entonces:
- encuentra la clave "PHP" en el texto del asunto y la reemplaza con: "PHP: Preprocesador de hipertexto", lo que da como resultado:
“PHP: Preprocesador de hipertexto: Preprocesador de hipertexto”.
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:
“PHP: Preprocesador de hipertexto”.
no hay más llaves que buscar, por lo que el reemplazo termina ahí.
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.