Перша відмінність:
Цікавий приклад різної поведінки між 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.