Если нужно заменить сразу несколько строк, многие используют str_replace(). Но есть нюанс: замены выполняются последовательно, поэтому результат одной замены может попасть под следующую.
🔴 Например:
$map = [
'foo' => 'bar',
'foobar' => 'foo',
];
$input = 'foobar and foo';
echo str_replace(
array_keys($map),
array_values($map),
$input
);
// bar bar and bar
Сначала "foo" превращается в "bar", поэтому "foobar" становится "barbar" и до второй замены уже не доходит.
🔴 strtr() работает иначе:
echo strtr($input, $map);
// foo and bar
Функция выполняет один проход по строке и всегда выбирает самое длинное совпадение. Уже заменённые части строки повторно не обрабатываются.
Благодаря этому:
— не нужно сортировать шаблоны по длине;
— замены не влияют друг на друга;
— результат получается более предсказуемым.
Если требуется заменить несколько независимых подстрок по словарю вида "что" => "на что", strtr() часто оказывается более удачным выбором.
Библиотека пхпшника