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

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

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

Помимо синтаксиса: какое-то благодеяние есть из-за того, что использует одну или другую? Существуют случаи, где одной не было бы достаточной, чтобы получать искавший результат?

Первоначальный вопрос: When to использовал strtr vs str_replace?

11
задан 23.05.2017, 05:39
2 ответа

Заметь перевода: Первоначальный вопрос был выдвинут из-за @andrewtweber и отвечен мной самим в сайте StackOverflow на английском.

Первое различие:

Интересный пример поведения, дифференцированного между 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);
?>
  • Результат esperable: "ZDDB"
  • Однако, что получается: "ZDDD" (Потому что в B он соответствует ему D согласно нашей договоренности)

Чтобы способствовать тому, чтобы это функционировало, как он был бы esperable, лучше использовать 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: Hypertext Preprocessor: Hypertext Preprocessor”.

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

      “PHP: Hypertext Preprocessor”.

    3. поскольку нет больше ключей из-за того, что проверяет, процесс замены заканчивается там.
9
ответ дан 01.12.2019, 08:18
  • 1
    ¿ Ты забыл пометить ее как принятая? –  A. Cedano 26.07.2017, 09:54

Дополняя объяснение Николаса, результат меняется из-за поведения функций.

  • strtr сделан для remplazar символы, независимо от формы, которую ты используешь, и пробегает главная цепь характер из-за характера, когда он находит совпадение с символами поисков, remplaza и изюмом в следующий характер.
  • str_replace будь сделана, чтобы заменять субцепи, не импортируя длины источника и судьбы, в отличие от предыдущей, которая это должны быть индивидуальные символы. Тогда каждым элементом, который он нужно искать, пробегается вся главная цепь, заменяет все совпадения этой, и потом происходят со следующей субцепью..., если ты идешь в пример nicolas, "2" remplaza во всех сторонах из-за "B", и в других последующих поисках он меняется "B" из-за "D", и из-за того, что - отдельные поездки, мы получаем "ZDDD" вместо "ZDDB".

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

Давайте предполагать, что у нас есть главная цепь 100 символов, и давайте идти искать 10 символов:

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

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

5
ответ дан 01.12.2019, 08:18
  • 1
    Чтобы дополнять informaci и # 243; n другого ответа лучше издавать ее или добавлять комментарий для того, чтобы автор издал ее. –  Gepser 17.12.2015, 03:10
  • 2
    Я только что зарегистрировался aqu и # 237; схвати и # 237; который я не могу комментировать: v –  Willem Franco 17.12.2015, 03:39
  • 3
    Верный, не tom и # 233; в счете это. Тогда ты принес пользу в ответе. Привет. –  Gepser 17.12.2015, 03:46

Теги

Похожие вопросы