Зарегистрируйтесь, чтобы продолжить обучение

Генерация строки в цикле PHP: Массивы

Генерация строк в циклах — это частая задача в работе программиста, часто возникающая на практике. Типичный пример в вебе — функция-хелпер, помогающая генерировать 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

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

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

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

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

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

Аватары экспертов Хекслета

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

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

Для полного доступа к курсу нужен базовый план

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

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

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

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»