PHP: Массивы
2026-02-26 18:30 Diff

Генерация строк в циклах — это частая задача в работе программиста, часто возникающая на практике. Типичный пример в вебе — функция-хелпер, помогающая генерировать HTML-списки в шаблонах. Она принимает на вход коллекцию элементов и возвращает список из них:

Самый примитивный алгоритм, который приходит в голову — пройтись циклом по элементам коллекции и дописать в результирующую строку очередной тег <li>. В начале и конце нужно добавить <ul> и вернуть строчку наружу:

Такой способ вполне рабочий, но для большинства языков программирования он максимально неэффективен.

Дело в том, что конкатенация и интерполяция порождают новую строчку вместо старой. И подобная ситуация повторяется на каждой итерации, причем строка становится ��се больше и больше. Копирование строк приводит к серьезному расходу памяти и может влиять на производительность.

Конечно, для большинства приложений эта проблема не так актуальна из-за небольшого объема прогоняемых данных. Тем не менее лучше использовать более эффективный подход, ведь он не сложнее в реализации и обладает дополнительными плюсами. Лучше сразу приучиться работать правильно и никогда больше не возвращаться к этому вопросу.

В статических языках для подобной цели используется String Buffer, а в динамических — обычный массив. Перепишем программу выше, используя эти новые знания:

Как видите, код не сильно поменялся. Разница в том, что теперь он собирает массив вместо строки, а в конце выдает строку с помощью implode. Помимо эффективности у такого подхода есть дополнительные плюсы:

  • Такой код проще отлаживать и анализировать внутренности
  • Массив можно дополнительно обработать при необходимости, а строку — уже нет

Регулируя разделитель, строки можно объединять разными способами. Например, через запятую:

Пробел после запятой добавит пространство между словами, сделает вывод более аккуратным:

Если каждое слово надо вывести на новой строчке, то в качестве разделителя используем символ перевода строки "\n":