1 added
1 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Генерация строк в циклах - это частая задача в работе программиста, часто возникающая на практике. Типичный пример в вебе - функция-хелпер, помогающая генерировать HTML-списки в шаблонах. Она принимает на вход коллекцию элементов и возвращает список из них:</p>
1
<p>Генерация строк в циклах - это частая задача в работе программиста, часто возникающая на практике. Типичный пример в вебе - функция-хелпер, помогающая генерировать HTML-списки в шаблонах. Она принимает на вход коллекцию элементов и возвращает список из них:</p>
2
<p>Самый примитивный алгоритм, который приходит в голову - пройтись циклом по элементам коллекции и дописать в результирующую строку очередной тег <li>. В начале и конце нужно добавить <ul> и вернуть строчку наружу:</p>
2
<p>Самый примитивный алгоритм, который приходит в голову - пройтись циклом по элементам коллекции и дописать в результирующую строку очередной тег <li>. В начале и конце нужно добавить <ul> и вернуть строчку наружу:</p>
3
<p>Такой способ вполне рабочий, но для большинства языков программирования он максимально неэффективен.</p>
3
<p>Такой способ вполне рабочий, но для большинства языков программирования он максимально неэффективен.</p>
4
-
<p>Дело в том, что конкатенация и интерполяция порождают новую строчку вместо старой. И подобная ситуация повторяется на каждой итерации, причем строка становится все больше и больше. Копирование строк приводит к серьезному расходу памяти и может влиять на производительность.</p>
4
+
<p>Дело в том, что конкатенация и интерполяция порождают новую строчку вместо старой. И подобная ситуация повторяется на каждой итерации, причем строка становится ��се больше и больше. Копирование строк приводит к серьезному расходу памяти и может влиять на производительность.</p>
5
<p>Конечно, для большинства приложений эта проблема не так актуальна из-за небольшого объема прогоняемых данных. Тем не менее лучше использовать более эффективный подход, ведь он не сложнее в реализации и обладает дополнительными плюсами. Лучше сразу приучиться работать правильно и никогда больше не возвращаться к этому вопросу.</p>
5
<p>Конечно, для большинства приложений эта проблема не так актуальна из-за небольшого объема прогоняемых данных. Тем не менее лучше использовать более эффективный подход, ведь он не сложнее в реализации и обладает дополнительными плюсами. Лучше сразу приучиться работать правильно и никогда больше не возвращаться к этому вопросу.</p>
6
<p>В статических языках для подобной цели используется<a>String Buffer</a>, а в динамических - обычный массив. Перепишем программу выше, используя эти новые знания:</p>
6
<p>В статических языках для подобной цели используется<a>String Buffer</a>, а в динамических - обычный массив. Перепишем программу выше, используя эти новые знания:</p>
7
<p>Как видите, код не сильно поменялся. Разница в том, что теперь он собирает массив вместо строки, а в конце выдает строку с помощью implode. Помимо эффективности у такого подхода есть дополнительные плюсы:</p>
7
<p>Как видите, код не сильно поменялся. Разница в том, что теперь он собирает массив вместо строки, а в конце выдает строку с помощью implode. Помимо эффективности у такого подхода есть дополнительные плюсы:</p>
8
<ul><li>Такой код проще отлаживать и анализировать внутренности</li>
8
<ul><li>Такой код проще отлаживать и анализировать внутренности</li>
9
<li>Массив можно дополнительно обработать при необходимости, а строку - уже нет</li>
9
<li>Массив можно дополнительно обработать при необходимости, а строку - уже нет</li>
10
</ul><p>Регулируя разделитель, строки можно объединять разными способами. Например, через запятую:</p>
10
</ul><p>Регулируя разделитель, строки можно объединять разными способами. Например, через запятую:</p>
11
<p>Пробел после запятой добавит пространство между словами, сделает вывод более аккуратным:</p>
11
<p>Пробел после запятой добавит пространство между словами, сделает вывод более аккуратным:</p>
12
<p>Если каждое слово надо вывести на новой строчке, то в качестве разделителя используем символ перевода строки "\n":</p>
12
<p>Если каждое слово надо вывести на новой строчке, то в качестве разделителя используем символ перевода строки "\n":</p>
13
13