Ответ 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: препроцессор гипертекста".
-
больше нет ключей для поиска, поэтому замена заканчивается там.
- он находит ключ "PHP" в тексте темы и заменяет его: "PHP: Hypertext Preprocessor", что дает результат: