SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】年度に分ける例(4月開始の)

問題

といったとき、どうしましょう。

年度です。4月スタートで3月終了のあの年度です。

答え

こうしてみた。

//年リスト作成(スタートと終了は適宜調整)
$ym = array();
foreach (range(1990, date('Y')) as $y) {
        foreach (array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12') as $m) {
                $ym[] = array($y, $m);
        }
}

//後ろに3ヶ月追加して、来年03月終わりにする
$ym[] = array(date('Y') + 1, '01');
$ym[] = array(date('Y') + 1, '02');
$ym[] = array(date('Y') + 1, '03');

//先頭3ヶ月削除して、04月スタートにする
unset($ym[0], $ym[1], $ym[2]);

//新しい方を上にしたいときは反転
$ym = array_reverse($ym);

//12ヶ月ごとに割る
$ym = array_chunk($ym, 12);

これで $ym は、以下のような配列になる

array (
  0 => 
  array (
    0 => 
    array (
      0 => 2013,
      1 => '03',
    ),
    1 => 
    array (
      0 => 2013,
      1 => '02',
    ),
    2 => 
    array (
      0 => 2013,
      1 => '01',
    ),
    3 => 
    array (
      0 => 2012,
      1 => '12',
    ),
    4 => 
    array (
      0 => 2012,
      1 => '11',
    ),
    5 => 
    array (
      0 => 2012,
      1 => '10',
    ),
    6 => 
    array (
      0 => 2012,
      1 => '09',
    ),
    7 => 
    array (
      0 => 2012,
      1 => '08',
    ),
    8 => 
    array (
      0 => 2012,
      1 => '07',
    ),
    9 => 
    array (
      0 => 2012,
      1 => '06',
    ),
    10 => 
    array (
      0 => 2012,
      1 => '05',
    ),
    11 => 
    array (
      0 => 2012,
      1 => '04',
    ),
  ),
  1 => 
  array (
    0 => 
    array (
      0 => 2012,
      1 => '03',
    ),
    1 => 
    array (
      0 => 2012,
      1 => '02',
    ),
    2 => 
    array (
      0 => 2012,
      1 => '01',
    ),
    3 => 
    array (
      0 => 2011,
      1 => '12',
    ),
    4 => 
    array (
      0 => 2011,
      1 => '11',
    ),
......
......
    8 => 
    array (
      0 => 1991,
      1 => '07',
    ),
    9 => 
    array (
      0 => 1991,
      1 => '06',
    ),
    10 => 
    array (
      0 => 1991,
      1 => '05',
    ),
    11 => 
    array (
      0 => 1991,
      1 => '04',
    ),
  ),
  22 => 
  array (
    0 => 
    array (
      0 => 1991,
      1 => '03',
    ),
    1 => 
    array (
      0 => 1991,
      1 => '02',
    ),
    2 => 
    array (
      0 => 1991,
      1 => '01',
    ),
    3 => 
    array (
      0 => 1990,
      1 => '12',
    ),
    4 => 
    array (
      0 => 1990,
      1 => '11',
    ),
    5 => 
    array (
      0 => 1990,
      1 => '10',
    ),
    6 => 
    array (
      0 => 1990,
      1 => '09',
    ),
    7 => 
    array (
      0 => 1990,
      1 => '08',
    ),
    8 => 
    array (
      0 => 1990,
      1 => '07',
    ),
    9 => 
    array (
      0 => 1990,
      1 => '06',
    ),
    10 => 
    array (
      0 => 1990,
      1 => '05',
    ),
    11 => 
    array (
      0 => 1990,
      1 => '04',
    ),
  ),
)

foreachでループさせれば、1段目が年度のループ、2段目が月のループとなる。

あとは、ループの中で年月がマッチしたデータを表示するなどの処理をおこなえばよい。


タイムスタンプ(date()関数や、strtotime()関数など)に依存すると、1970年~2038年までの範囲しか扱えなくなるので、依存しないようにしたのもポイント。

関連するメモ

コメント