phpstringstr-replacestrtr

When to use strtr vs str_replace?


I'm having a hard time understanding when strtr would be preferable to str_replace or vice versa. It seems that it's possible to achieve the exact same results using either function, although the order in which substrings are replaced is reversed. For example:

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');

This outputs

YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring

Aside from syntax, is there any benefit to using one over the other? Any cases where one would not be sufficient to achieve a desired result?


Solution

  • First difference:

    An interesting example of a different behaviour between strtr and str_replace is in the comments section of the PHP Manual:

    <?php
    $arrFrom = array("1","2","3","B");
    $arrTo = array("A","B","C","D");
    $word = "ZBB2";
    echo str_replace($arrFrom, $arrTo, $word);
    ?>
    

    To make this work, use "strtr" instead:

    <?php
    $arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
    $word = "ZBB2";
    echo strtr($word,$arr);
    ?>
    

    This means that str_replace is a more global approach to replacements, while strtr simply translates the chars one by one.


    Another difference:

    Given the following code (taken from 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);
    ?>
    

    The resulting lines of text will be:

    string(3) "PHP"
    string(27) "PHP: Hypertext Preprocessor"


    The main explanation:

    This happens because: