Когда использовать 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

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

Ответ 1

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

Интересный пример различного поведения между 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);
?>

Результирующие строки текста будут следующими:

строка (3) "PHP"
строка (27) "PHP: гипертекстовый препроцессор"


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

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

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

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

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

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

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

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

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

Ответ 2

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

Это не всегда верно и зависит от поиска и замены данных, которые вы предоставляете. Например, где две функции различаются, см. Есть ли у strprep strphere более 13 символов?

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

Ответ 3

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

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

см. Php Manual Strtr.

Ответ 4

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

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

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