У меня была задача, согласно которой, нужно разбивать интервал дат на недельные периоды. Неделей считается интервал от пн по вс либо текущего дня по вс (например, если первое число месяца выпадает на отличный от пн день) либо пн по текущий день (если конец месяца выпадает на день отличный от вс).

Пример:

входные данные 01.08.2014 — 30.08.2015

на выходе:

01.08.2014 — 03.08.2014

04.08.2014 — 10.08.2014

11.08.2014 — 17.08.2014

18.08.2014 — 24.08.2014

25.08.2014 — 31.08.2014

01.09.2014 — 07.09.2014

29.09.2014 — 30.09.2014

01.10.2014 — 05.10.2014

06.10.2014 — 12.10.2014

Мое решение. Может кому-то пригодится.

/**
* @param string $from начало периода
* @param string $to конец периода
*
* @return array
*/
function getWeekPeriod($from, $to)
{
    $weeks = [];
    $from = strtotime($from);
    $to = strtotime($to);</code>

    while ($from &lt; $to) {
        // echo "from:\t", date('d.m.Y', $from), RN;

        // номер дня недели начала периода
        $fromDay = date("N", $from);
        // echo "fromDay:\t", $fromDay, RN;

        // если не ВС
        if ($fromDay &lt; 7) {
            // кол-во дней до ВС
            $daysToSun = 7 - $fromDay;

            // echo "daysToSun:\t", $daysToSun, RN;

            // конец недельного периода
            $end = strtotime("+ $daysToSun day", $from);

            // если попадаем на след. месяц, то делаем новые вычисления
            if (date("n", $from) != date("n", $end)) {
                $end = strtotime("last day of this month", $from);
            }

            $weeks[] = [date('d.m.Y', $from), date('d.m.Y', $end)];
            $from = $end;
        } else {
            $weeks[] = [date('d.m.Y', $from), date('d.m.Y', $from)];
        }

        // echo "end:\t", date('d.m.Y', $from), RN, RN;

        $from = strtotime("+1 day", $from);
    }

    return $weeks;
}