Когда использовать strtr против str_replace? - PullRequest
80 голосов
/ 18 ноября 2011

Мне трудно понять, когда 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

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

Ответы [ 4 ]

126 голосов
/ 18 ноября 2011

Первое отличие:

Интересный пример различного поведения между 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: Препроцессор гипертекста»


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

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

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

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

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

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

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

      «PHP: гипертекстовый препроцессор».

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

18 голосов
/ 18 ноября 2011

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

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

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

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

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

см .: Php Manual Strtr .

1 голос
/ 19 сентября 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...