PHP で固定間隔の時系列を生成する方法
PHP の組み込みの関数を利用して固定間隔のタイムシリーズを取得する方法についてご紹介します。
出力のイメージは次のとおりです。
['2020年12月','2020年11月','2020年10月',]
この場合は DatePeriod
オブジェクトを使うやり方がシンプルです。
/*** 1 ヶ月間隔で連続した年月を生成する*/function get_month_series(DateTime $start, DateTime $stop) {$interval = new DateInterval('P1M');$monthrange = new DatePeriod($start, $interval, $stop);$time_units = [];foreach ($monthrange as $m) {$value = date('Y年m月', $m->getTimestamp());$time_units[] = $value;}return array_reverse($time_units);}
テストしてみます。
$start = new DateTime();$start->setDate(2020, 10, 1);$stop = new DateTime();$stop->setDate(2021, 1, 1);$months = get_month_series($start, $stop);var_dump($months);// => [// "2020年12月",// "2020年11月",// "2020年10月",// ]
うまく使えています。
ポイントは次のとおりです。
DateInterval()
のコンストラクタには固有の書式(P1M
など)を使う(ちなみにP1M
は 1 ヶ月間隔という意味です)。DatePeriod()
はネガティブインターバルは受け付けないので、降順の一覧を生成したい場合は昇順に生成したものをarray_reverse()
でひっくり返す必要がある。
PHP だとこういう処理は手続き型で汚く書いてしまいがちですが、こういうこともできるみたいです。 日付選択のセレクトボックスの生成などに重宝します。