TGViewer
Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter @phpproglib · 10.5K subscribers
Post #6672 2.09K
😧 Почему strtr() иногда лучше, чем str_replace()

Если нужно заменить сразу несколько строк, многие используют 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() часто оказывается более удачным выбором.

Библиотека пхпшника
  • 🤔 7
  • 🔥 5
  • ❤ 1
  • 🥱 1
More from @phpproglib
  1. Sep 20, 2026❓ Какие существуют проблемы в многопоточной среде? Основные проблемы многопоточности: 1️⃣…
  2. Sep 19, 2026🌞 В Symfony 8.2 появилось 29 новых Bundle — теперь компоненты вроде Mailer, Messenger и C…
  3. Sep 19, 2026А вы уже забрали свой подарок ко Дню программиста? К вашему профессиональному празднику Tp…
  4. Sep 18, 2026🐸 Библиотека пхпшника
  5. Sep 17, 2026🛠 `str_contains` и семья: проверяем строки без ловушек Проверка через strpos годами путал…
  6. Sep 16, 2026⚡️ Symfony 8.2: команды Console теперь можно вызывать через пробелы В Symfony команды обыч…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →