2014-09-02 109 views
2

我正在製作一個函數,將當前月份分成幾周,每週以其開始和結束日期。例如,當前月份是九月,所以這是我希望我的函數返回:按開始日期和結束日期分配一個月,每週數組

$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'; 

我明白,只有非閏年的二月將有4周。 這是我迄今爲止

$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); 

它的工作原理幾乎正常,但我希望它停止在每月的最後一週的最後一天。 以上代碼與本週的5th索引有問題。它的結果

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

如何解決這個問題?

謝謝你的回答。

回答

4

你可以添加一個檢查,你for循環的開始,如果結束日期比天的月份數時停止處理:

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

Output

或者,如果你還在要部分星期結束時,你可以使用類似的檢查,以確定最後一天應該是什麼:

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在最後一個完整的星期:

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

是。我正要評論說這裏可能需要'else'。讓我測試一下硬編碼月份的代碼,比如2月份和其他月份的31天,但看起來這個函數可以正常工作。謝謝 :) – 2014-09-02 04:49:15

1

另一種選擇是使用DatePeriod類這一個了。例如:

$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); 

應該產生這樣的:

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 
     ) 

) 
相關問題