Итерация по периоду времени в 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 день).