Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Генерация строки в цикле

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

<?php

$coll = ['milk', 'butter', 'eggs', 'bread'];
buildList($coll);
// <ul><li>milk</li><li>butter</li><li>eggs</li><li>bread</li></ul>

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

<?php

$result = '';
foreach ($coll as $item) {
    $result .= "<li>{$item}</li>";
    // либо так
    // $result = "{$result}<li>{$item}</li>";
}
$result = "<ul>{$result}</ul>";

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

<?php

$parts = []; // переименовал для того, чтобы не менять значения переменной
foreach ($coll as $item) {
    $parts[] = "<li>{$item}</li>";
}
$innerValue = implode(' ', $parts);
$result = "<ul>{$innerValue}</ul>";

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

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

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

<?php

$parts = ['JavaScript', 'PHP', 'Python'];

$output = implode(',', $parts);

print_r($output); // => JavaScript,PHP,Python

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

<?php

$parts = ['JavaScript', 'PHP', 'Python'];

$output = implode(', ', $parts); // поменяли разделитель, добавив пробел

print_r($output); // => JavaScript, PHP, Python

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

<?php

$parts = ['JavaScript', 'PHP', 'Python'];

$output = implode("\n", $parts); // теперь каждое слово будет начинаться с новой строки
// или с предопределённой константой
// $output = implode(PHP_EOL, $parts);

print_r($output); // =>
// JavaScript
// PHP
// Python

Дополнительные материалы

  1. Джоэль Спольски. Назад к основам (английская версия)

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Для полного доступа к курсу нужна профессиональная подписка

Профессиональная подписка откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, даст возможность обращаться за помощью к менторам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».