HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Генерация строк в циклах - это частая задача в работе программиста, часто возникающая на практике. Типичный пример в вебе - функция-хелпер, помогающая генерировать HTML-списки в шаблонах. Она принимает на вход коллекцию элементов и возвращает список из них:</p>
1 <p>Генерация строк в циклах - это частая задача в работе программиста, часто возникающая на практике. Типичный пример в вебе - функция-хелпер, помогающая генерировать HTML-списки в шаблонах. Она принимает на вход коллекцию элементов и возвращает список из них:</p>
2 <p>Самый примитивный алгоритм, который приходит в голову - пройтись циклом по элементам коллекции и дописать в результирующую строку очередной тег &lt;li&gt;. В начале и конце нужно добавить &lt;ul&gt; и вернуть строчку наружу:</p>
2 <p>Самый примитивный алгоритм, который приходит в голову - пройтись циклом по элементам коллекции и дописать в результирующую строку очередной тег &lt;li&gt;. В начале и конце нужно добавить &lt;ul&gt; и вернуть строчку наружу:</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