Когда использовать strtr vs str_replace?

Мне сложно понять, когда strtr предпочтительнее str_replace или наоборот. Кажется, что можно достичь тех же результатов, используя любую функцию, хотя порядок замены подстрок отменяется. Например:

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

Эти результаты

 YeXY XYring YeZ Zring YeXY XYring YeZ Zring 

Помимо синтаксиса, есть ли какая-либо польза от использования одного над другим? Любые случаи, когда одного не хватит для достижения желаемого результата?

    Первая разница:

    Интересный пример другого поведения между strtr и str_replace содержится в разделе комментариев руководства PHP:

     <?php $arrFrom = array("1","2","3","B"); $arrTo = array("A","B","C","D"); $word = "ZBB2"; echo str_replace($arrFrom, $arrTo, $word); ?> 
    • Я бы ожидал в результате: «ZDDB»
    • Однако это возвращение: «ZDDD» (потому что B = D в соответствии с нашим массивом)

    Чтобы выполнить эту работу, вместо этого используйте «strtr»:

     <?php $arr = array("1" => "A","2" => "B","3" => "C","B" => "D"); $word = "ZBB2"; echo strtr($word,$arr); ?> 
    • Это возвращает: «ZDDB»

    Это означает, что str_replace является более глобальным подходом к замене, в то время как strtr просто переводит символы один за другим.


    Другое отличие:

    Учитывая следующий код (взятый из сравнения скорости замены строк 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); ?> 

    Полученные строки текста будут следующими:

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


    Основное объяснение:

    Это происходит потому, что:

    • strtr : сортирует свои параметры по длине в порядке убывания, поэтому:

      1. это даст «большее значение» самому большому, а затем, поскольку сам текст сам по себе является самым большим ключом заменяющего массива, он переводится.
      2. потому что все символы текста темы были заменены, процесс заканчивается там.
    • str_replace : он работает в порядке определения ключей, поэтому:

      1. он находит ключ «PHP» в тексте темы и заменяет его: «PHP: Hypertext Preprocessor», что дает результат:

        «PHP: препроцессор гипертекста: препроцессор гипертекста».

      2. затем он находит следующий ключ: «PHP: Hypertext Preprocessor» в результирующем тексте предыдущего шага, поэтому его заменяет «PHP», что дает результат:

        «PHP: препроцессор гипертекста».

      3. больше нет ключей для поиска, поэтому замена заканчивается там.

    Кажется, что можно достичь точно таких же результатов, используя любую функцию

    Это не всегда верно и зависит от поиска и замены данных, которые вы предоставляете. Например, если две функции различаются, см.: Имеет ли PHP str_replace ограничение более 13 символов?

    • strtr не заменит в частях строки, которые уже были заменены – str_replace заменит внутренние замены.
    • strtr начнет с самого длинного ключа первым, если вы str_replace его с двумя параметрами – str_replace заменит слева направо.
    • str_replace может вернуть количество выполненных замен – strtr не предлагает такого значения count.

    Я думаю, что strtr обеспечивает более гибкую и условную замену при использовании с двумя аргументами, например: если строка равна 1, замените на a, но если строка равна 10, замените на b. Этот трюк может быть достигнут только strtr .

     $string = "1.10.0001"; echo strtr($string, array("1" => "a", "10" => "b")); // ab000a 

    см .: Php Manual Strtr .

    Обратите внимание, что в руководстве STRTR– Описание string strtr (string $ str, string $ from, string $ to) string strtr (string $ str, array $ replace_pairs) Если заданы три аргумента, эта функция возвращает копию str, где …

    STR_REPLACE– … Если поиск или замена являются массивами, их элементы обрабатываются в первую очередь . …

    STRTR каждый поворот НЕ воздействует на следующий, НО STR_REPLACE делает.