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