開始月と終了月をインプットとしてその間の月のリストを取得したい

やりたいこと

この入力に対してこの出力を得たい。

入力:’2014-09’, ‘2015-03’

出力:’2014-09’,’2014-10’,’2014-11’,’2014-12’,’2015-01’, ‘2015-02’,’2015-03’
(’2014-09’から’2015-03’までの月ごとのリスト)

date型をループの条件とする

年月だけのフォーマットだとdateで扱いにくいので年月日(日は常に1日)形式とする。

ポイントは日付でもループ処理の条件として使えるという点。 単純にインクリメントするのは数値を前提にしてしまいがちだけど、日や月を加算してループをまわすこともできる。

// 入力
$start_month = "2014-09";
$end_month = "2015-03";

// 日の文字列を付与
$start_date = $start_month . "-01";
$end_date = $end_month . "-01";

// 月を+1しながらループをまわす
$month_list = array();
$m = $start_date;
while($m <= $end_date){
        $month_list[] = $m;
        $m = date("Y-m-d", strtotime("$m +1 month"));
}
var_dump($month_list);

出力結果

array(7) { [0]=> string(10) "2014-09-01" [1]=> string(10) "2014-10-01" [2]=> string(10) "2014-11-01" [3]=> string(10) "2014-12-01" [4]=> string(10) "2015-01-01" [5]=> string(10) "2015-02-01" [6]=> string(10) "2015-03-01" }

出力結果は年月日のままですが、実際に使うときに’-01’を一括で消す。