¿Cuándo usar strtr vs str_replace?

publicado por: Anonymous

Hay veces que es difícil entender cuándo es preferible usar strtr y cuándo usar str_replace. Parece que es posible obtener el mismo resultado con cualquiera de ellas, aunque el orden en que los substrings son reemplazados está invertido. 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');

Entrega como salida:

YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring

Aparte de la sintaxis, ¿hay algún beneficio por usar una u otra? ¿Existen casos donde una no sería suficiente para obtener el resultado buscado?

Pregunta original:
When to use strtr vs str_replace?

solución

Nota de la traducción:
La pregunta original fue planteada por @andrewtweber y respondida por mí mismo en el sitio StackOverflow en inglés.

Primera diferencia:

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

<?php
$arrFrom = array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo str_replace($arrFrom, $arrTo, $word);
?>
  • El resultado esperable es: “ZDDB”
  • Sin embargo, lo que se obtiene es: “ZDDD”
    (Porque a B le corresponde D según nuestro arreglo)

Para hacer que esto funcione como sería esperable, es mejor usar strtr:

<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>
  • Lo que retorna: “ZDDB”

Esto quiere decir que str_replace emplea un enfoque más global a los reemplazos, mientras que strtr simplemente traduce los caracteres uno por uno.


Otra diferencia:

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

<?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:

string(3) “PHP”
string(27) “PHP: Hypertext Preprocessor”


La explicación principal:

Las razones de este comportamiento son:

  • strtr: ordena sus parámetros por largo, en orden descendiente, por lo que:

    1. le dará “más importancia” al más largo, y entonces éste será traducido dado que el texto principal es en sí mismo la llave más larga del arreglo de reemplazos.
    2. dado que todos los caracteres del texto principal ya han sido reemplazados, entonces ahí termina el proceso.
  • str_replace: funciona en el orden en que fueron definidas las llaves, por lo tanto:

    1. encuentra la llave “PHP” en el texto principal y la reemplaza con: “PHP: Hypertext Preprocessor”, lo que da como resultado:

      “PHP: Hypertext Preprocessor: Hypertext Preprocessor”.

    2. entonces encuentra la siguiente llave: “PHP: Hypertext Preprocessor” en el texto resultante del paso anterior, por lo que es reemplazado por “PHP”, dando como resultado:

      “PHP: Hypertext Preprocessor”.

    3. como no hay más llaves por revisar, el proceso de reemplazo termina ahí.
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *