Первое отличие:
Интересный пример различного поведения между 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);
?>
Это означает, что 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 : сортирует параметры по длине в порядке убывания, поэтому:
- это придаст «большей важности» наибольшему, а затем, поскольку текст темы сам по себе является самым большим ключом массива замены, он переводится.
- поскольку все символы текста темы были заменены, процесс на этом заканчивается.
str_replace : работает в том порядке, в котором определены ключи, поэтому:
- находит ключ «PHP» в тексте темы и заменяет его на «PHP: Препроцессор гипертекста», что дает в результате:
«PHP: Препроцессор гипертекста: Препроцессор гипертекста».
затем он находит следующий ключ: «PHP: Препроцессор гипертекста» в результирующем тексте предыдущего шага, поэтому он заменяется на «PHP», что дает в результате:
«PHP: гипертекстовый препроцессор».
больше нет ключей для поиска, поэтому замена на этом заканчивается.