3

年ごとにグループ化された、指定された日付から現在までの月の配列を取得する最も効率的な方法は何ですか。

例 getMonths("August 2012") は出力します

array(
    array("Year"=>"2013", "months" = array(
         "February", "January")
    ),
    array("Year"=>"2012", "months" = array(
         "December", "November","October", "September", "August")
    )
)

これまでのところ、私は持っています:

$start = strtotime('2012-08-01');
$end = time();
$month = $start;
$months[] = date('F', $start);
while($month <= $end) {
  $month = strtotime("+1 month", $month);
  $months[] = date('F', $month);
}

これは正しい月を出力していますが、年にグループ化していません。ありがとう

4

2 に答える 2

11

あなたが試すことができます

function getMonths($month,$count = 1) {
    $now = new DateTime();
    $start = DateTime::createFromFormat("F Y", $month);
    $list = array();
    $interval = new DateInterval(sprintf("P%dM",$count));
    while ( $start <= $now ) {
        $list[$start->format("Y")][] = $start->format("F");
        $start->add($interval);
    }
    return $list;
}

print_r(getMonths("August 2012"));

出力

Array
(
    [2012] => Array
        (
            [0] => August
            [1] => September
            [2] => October
            [3] => November
            [4] => December
        )

    [2013] => Array
        (
            [0] => January
            [1] => February
        )

)
于 2013-02-27T20:43:47.147 に答える
0

ここに投稿された答えは私にとってはうまくいきませんでした(確かにオンラインサンドボックスも試しました)ので、私はPHPのほとんどのバージョンで動作するメソッドを書きました:

function getMonths($monat, $year) {
        $list = array();
        for(;$monat <= 12;$monat++) {
            if($year == date("Y") && $monat == date("m")) {     // exit on current month+year
                break;
            }
            if(!isset($list[ $year ])) {
                $list[ $year ] = array();
            }
            $list[ $year ][ str_pad($monat, 2, '0', STR_PAD_LEFT) ] = date("F", strtotime('01.' . $monat . '.' . $year));

            if($monat == 12) {
                $monat = 0;
                $year++;
            }
        }
        return $list;
    }
于 2014-09-16T11:49:32.893 に答える