sábado, 1 de septiembre de 2007

str_replace - strtr

Estas dos funciones son muy parecidas. En general, str_replace es más famosa, pero ¿cuál conviene? Vamos a probar...

str_replace('e','a','hello world');
strtr('hello world','e','a');

Vamos a comparar un reemplazo simple. En esta comparación, str_replace se lleva un punto.

¿Qué pasa si se quiere reemplazar un texto que no se encuentra?
Ambas funciones funcionan más rápido, pero str_replace sigue siendo más óptima. En esta instancia, ya parecería mejor esta opción, pero ambas funciones nos permiten reemplazar varios textos a la vez. Probemos.

str_replace(array('o','e'),'a','hello world');
strtr('hello world',array('o' => 'a','e' => 'a'));

En este caso reemplazamos "o" y "e" por "a", y str_replace sigue siendo mejor... Vamos a darle una última oportunidad a strtr

str_replace(array('o','e'),array('i','o'),'hello world');
strtr('hello world',array('o' => 'i','e' => 'o'));

En este caso, se reemplaza 'o' por 'i' y 'e' por 'a', y sorpresivamente strtr se lleva la victoria.

Conclusión: en general, es preferible utilizar str_replace, pero cuando se quiere reemplazar un conjunto de caracteres por otro conjunto (y no un único valor) es mejor strtr.

Ver ejemplo

4 comentarios:

barbazul dijo...

Cuando decís que strtr o str_replace "se lleva la victoria" estás hablando de benchmarking?

Una cuestión estra, strtr tiene una funcionalidad extra que no la tiene str_replace que es el llamado con 3 parametros:

$str = "#0!@";
echo strtr($str,"@#!0","ahlo"); //hola

es parecido al llamado con arrays pero convierte cada aparicion de cada caracter en la primera cadena al correspondiente caracter de la segunda cadena...

Unknown dijo...

Después de este post descubrí eso, pero más importante aún me parece este otro descubrimiento

echo str_replace(array('a', 'b'), array('b', 'c'), 'abc'); // 'ccc'
echo strtr('abc', array('a' => 'b', 'b' => 'c')); // 'bcc'

Es decir, que con strtr no reemplaza lo que ya fue reemplazado

barbazul dijo...

Nice!!!

dana dijo...

Muchas Graciasss!