使用开始日期和结束日期数组分配一个月的周数

I'm making a function that would break current month into an array of weeks, each week with its starting and ending date. For example the current month is September, so this is what I expect my function to return:

$week_arr[1]['start'] = '1-09-2014';
$week_arr[1]['end'] = '7-09-2014';
$week_arr[2]['start'] = '8-09-2014';
$week_arr[2]['end'] = '14-09-2014';
/*
.
.
.
*/
$week_arr[5]['start'] = '29-09-2014';
$week_arr[5]['end'] = '30-09-2014';

I understand that only non-leap February will have 4 weeks. This is what I have so far

$no_of_days_in_month = date("t");
$no_of_weeks = (ceil(intval($no_of_days_in_month)/7));

$week_inc = 0;
$curr_month_year = date("m-Y");

$week_arr = array();
for($i = 1; $i <= $no_of_weeks; $i++){
    $week_arr[$i]['start'] = ($week_inc+1)."-".$curr_month_year;
    $week_arr[$i]['end'] = ($week_inc+7)."-".$curr_month_year;
    $week_inc += 7;
}
var_dump($week_arr);

It works almost correctly, except I want it to stop on the last day of the month in the last week. Above code has a problem with the 5th index of the week. It results

  $week_arr[5]['start'] = '29-09-2014'
  $week_arr[5]['end'] = '35-09-2014'

How to fix that?

Thank you for your answers.

You could add a check to the start of your for loop to stop processing if the end date is greater than the number of days in the month:

if($week_inc + 7 > $no_of_days_in_month)
    break;

Output

Or if you still want the partial week at the end, you could use a similar check to define what the last day should be:

for($i = 1; $i <= $no_of_weeks; $i++){
    if($week_inc + 7 > $no_of_days_in_month)
        $day = $no_of_days_in_month;
    else
        $day = $week_inc + 7;

    $week_arr[$i]['start'] = ($week_inc+1)."-".$curr_month_year;
    $week_arr[$i]['end'] = $day."-".$curr_month_year;
    $week_inc += 7;
}

You'll then get a partial week at the end:

[5] => Array
    (
        [start] => 29-09-2014
        [end] => 30-09-2014
    )

Another option would be to use a DatePeriod class for this one too. Example:

$begin = new DateTime('first day of ' . date('Y-m-d'));
$end = new DateTime('last day of ' . date('Y-m-d'));
$interval = new DateInterval('P1W');
$daterange = new DatePeriod($begin, $interval, $end);

$dates = array();
foreach($daterange as $key => $date) {

    $check = ($date->format('W') != $end->modify('last day of this month')->format('W')) ? '+6 days' : 'last day of this week';
    $dates[$key+1] = array(
        'start' => $date->format('Y-m-d'),
        'end' => $date->modify($check)->format('Y-m-d'),
    );
}

echo '<pre>';
print_r($dates);

Should yield this:

Array
(
    [1] => Array
        (
            [start] => 2014-09-01
            [end] => 2014-09-07
        )

    [2] => Array
        (
            [start] => 2014-09-08
            [end] => 2014-09-14
        )

    [3] => Array
        (
            [start] => 2014-09-15
            [end] => 2014-09-21
        )

    [4] => Array
        (
            [start] => 2014-09-22
            [end] => 2014-09-28
        )

    [5] => Array
        (
            [start] => 2014-09-29
            [end] => 2014-09-30
        )

)