Итерация по периоду времени в php

Неоднократно приходилось работать на php со списком дат (по дням, к примеру) если есть начало и конец периода ($dateStart, $dateEnd). Например, для того, чтобы синхронизировать с бекендом рабочие/выходные дни для DatePicker из jQueryUi. Или, если нужно выводить отчеты по дням.

Предлагаю несколько вариантов решения этой задачи, как наиболее очевидным способом, так и более изящным (как мне показалось).

Можно, конечно, в цикле менять дату, постоянно добавлять один день и проверять условие выхода с цикла, например как-то так:

<?php

$startDate = new DateTime('-1 week');
$endDate = new DateTime();

$date = clone $startDate;

while ($date <= $endDate) {
    echo "{$date->format('d-m-y')}\n";
    $date->modify('+1 day');
}

(Просто пример, не воспринимайте серьезно ;))

Строка $date = clone $dateStart; нужна для того, чтобы сохранить начальное значение переменной $dateEnd - ведь метод modify меняет значение в обджекте.

Но существует, как мне показалось, более изящное решение с использованием DatePeriod и DateInterval:

<?php

$startDate = new DateTime('-1 week');
$endDate = new DateTime();
$period = new DatePeriod($startDate, new \DateInterval('P1D'), $endDate->modify('+1 day'));

foreach ($period as $date) {
    echo "{$date->format('d-m-y')}\n";
}

В примере мы создаем объект DatePeriod, по которому можно будет уже итерировать привычным образом у foreach.

Обратите внимание, что при итерации по таком объекте он не включает последнего элемента периода (он работает так, если бы в первом примере вы использовали строго меньше, <), поэтому добавляем один день:

$endDate->modify('+1 day')

(Возможно здесь тоже требуется clone).

Таким образом вы можете итерировать по любому периоду с нужным интервалом (у нашем примере 'P1D' - 1 день).