На днях возникла задача на перебор дат в заданном диапазоне на php. Точнее – нужно было создать функцию, которая на входе принимала дату (в двух вариантах: день, месяц, год или месяц и год), а на выходе выдавала все даты месяца, который принимался в качестве аргумента, начиная с первого дня месяца, либо же с заданного, если он передается функции.
Например, передается дата 09-12-2013. Функция должна создать массив с датами, начиная с 2013-12-09 по 2013-12-31. Если же передается дата без дня, например, 12-2013, то возвращается массив дат с 2013-12-01 по 2013-12-31.
Основная трудность – это наличие различного количества дней в месяцах, поэтому мы не можем просто задать цикл из 30 или 31-го дней. Должен быть учет всех этих вариаций и наличие 29-го февраля (раз в 4 года). Но решение оказалось простым. Вот, собственно говоря, сама функция:
function getDatesArray($day = null, $month, $year)
{
//инициализируем массив, в котором будем сохранять даты
$dates = array();
//определяем день старта
if ($day) {
$date = $year . '-' . $month . '-' . $day;
} else {
$date = $year . '-' . $month . '-01';
}
//заполняем массив датами
do {
$dates[] = $date;
echo $date . "<br>";
$date = date('Y-m-d', strtotime($date . ' + 1 days'));
$currDateArr = explode('-', $date);
} while ($month == $currDateArr[1]);
}
Для получения нового дня, используем простое выражение strtotime($date . ‘ + 1 days’). Выход из цикла осуществляется проверкой равенства месяца текущей (новой) даты и заданного месяца.
Если мы вызовем функцию со следующими аргументами:
getDatesArray('01', '10', '2013');
то получим даты:
2013-10-01
2013-10-02
2013-10-03
…
2013-10-31
Встроенные в php функции по форматированию даты сами определяют, сколько дней в том или ином месяце.
P.S. Если у вас есть вариант более лаконичный – пишите в комментариях:)