キーがタイムスタンプで値がゼロのダミー配列を生成しています。開始は今日(時間部分のない日付)であり$days
、過去の数日間に戻ります。
$days = 10;
$limit = strtotime(date('Y-m-d'));
$start = $limit - (($days - 1) * 86400);
// Dummy array of timestamps and zeroes
$dummy = array_combine(range($start, $limit, 86400), array_fill(0, $days, 0));
var_dump($dummy);
array (size=10)
1337551200 => int 0
1337637600 => int 0
1337724000 => int 0
1337810400 => int 0
1337896800 => int 0
1337983200 => int 0
1338069600 => int 0
1338156000 => int 0
1338242400 => int 0
1338328800 => int 0 // Today is the last
この配列は、MySQL結果セットから抽出された別の配列とマージされます(その値はダミーの配列をオーバーライドする必要があります)。
$keys = array_map(function($e) { return strtotime($e['date']); }, $values);
$vals = array_map(function($e) { return intval($e['count']); }, $values);
// Array of real values coming from database
$reals = array_combine($keys, $vals);
var_dump($reals);
array (size=1)
1338328800 => int 2 // Today
キーの並べ替えを操作するのでarray_merge
(タイプのキーの場合integer
)、配列演算子に切り替え+
、結果の配列が並べ替えられます:新しいキーが最初に来ます:
var_dump($reals + $dummy);
array (size=10)
1338328800 => int 2 // Today become the first
1337551200 => int 0
1337637600 => int 0
1337724000 => int 0
1337810400 => int 0
1337896800 => int 0
1337983200 => int 0
1338069600 => int 0
1338156000 => int 0
1338242400 => int 0
したがって、問題は、+
オペレーターがこれらのキーを最初に配置し、以下のように、ソート関数を使用せずにこれを解決するにはどうすればよいかということです。
$merged = $reals + $dummy;
ksort($merged);
var_dump($merged);
array (size=10)
1337551200 => int 0
1337637600 => int 0
1337724000 => int 0
1337810400 => int 0
1337896800 => int 0
1337983200 => int 0
1338069600 => int 0
1338156000 => int 0
1338242400 => int 0
1338328800 => int 2