この記事の最終更新日: 2023年2月3日
MySQLやMariaDBで取得した日付順のデータ。取得する際に存在していないレコードの分、飛び飛びになっていることが多いです。
この飛び飛び(歯抜け)のレコード分、PHPで補完(穴埋め)する場合に、便利なメソッドを紹介します。
始まりと終わりの日付を指定して、全日付けの配列を作成。
使用するのは主にPHPのDatePeriodとDateIntervalです。
1日ずつは以下のコードで取得できます。
<?php
/**
* getDatePeriod
* 開始日付から終了日付までのDatePeriodを返す。
* @param string $startDate
* @param string $endDate
* @return DatePeriod
*/
public function getDatePeriod(string $startDate, string $endDate): DatePeriod
{
return new DatePeriod(
date_create(startDate), //$startDateは'2020-01-01'などの、始まりの日付
new DateInterval('P1D'),
date_create($endDate)->add(new DateInterval('P1D')) //$endDateは'2021-12-01'などの、終わりの日付
);
}
0から23時までの時間カラム含めたい場合
以下の記事を参考にしてください。
SQLの結果配列と、全日付配列を使って、新しい配列を作る。
次に、取得したSQL配列と突き合わせて、存在しない日付けだった場合0などのデフォルト値の配列を代入するなどして、新しい配列を作ればOKです。
例えばリンゴの売上をSQLで取得し、結果をこのような配列にしていた場合。(超適当な設定です)
<?php
$result = [
{
'date' => '2022-4-1',
'total_apple' => '2400',
'total_benefit' => '820000',
},
{
'date' => '2022-4-2',
'total_apple' => '2200',
'total_benefit' => '790000',
},
{
'date' => '2022-4-2',
'total_apple' => '3200',
'total_benefit' => '990000',
},
{
'date' => '2022-4-10',
'total_apple' => '1600',
'total_benefit' => '440000',
},
]
4月1日、4月2日、4月3日、4月10日はリンゴが売れたようです。
その結果をブラウザで表示する場合、4月4日から4月9日は’0’として表示したいはずです。
そこでこの配列と、先ほど作った日付けの配列を使って、mapかforeachを使って、結合すれば完成です。
SQLの段階で歯抜けを防ぎたい場合
以下の記事を参考にしてください。
大阪のエンジニアが書いているブログ。
コメント