按小时统计数据,无数据的时间点填充为0的实现方法

来源:互联网 发布:收据打印软件 注册码 编辑:程序博客网 时间:2024/04/30 01:59

最近遇到一个业务逻辑:俺小时查询某段时间的订单发货量,DB里边是按照小时来存的数据,如:


从数据库里查出来以后,并将数据处理成此种格式:

Array(    [XX1配送中心] => Array        (            [2013-04-01 11:00:00] => 2            [2013-04-01 12:00:00] => 710            [2013-04-01 13:00:00] => 35            [2013-04-01 14:00:00] => 501            [2013-04-01 15:00:00] => 851            [2013-04-01 16:00:00] => 678            [2013-04-01 17:00:00] => 693            [2013-04-01 18:00:00] => 929            [2013-04-01 19:00:00] => 31        )    [XX2配送中心] => Array        (            [2013-04-01 11:00:00] => 890            [2013-04-01 12:00:00] => 1002            [2013-04-01 13:00:00] => 46            [2013-04-01 14:00:00] => 1            [2013-04-01 15:00:00] => 382            [2013-04-01 16:00:00] => 154            [2013-04-01 17:00:00] => 314            [2013-04-01 18:00:00] => 255            [2013-04-01 19:00:00] => 1        )    [XX3配送中心] => Array        (            [2013-04-01 13:00:00] => 726            [2013-04-01 14:00:00] => 737            [2013-04-01 15:00:00] => 686            [2013-04-01 16:00:00] => 660            [2013-04-01 17:00:00] => 604            [2013-04-01 18:00:00] => 103            [2013-04-01 19:00:00] => 13        )    [XX4配送中心] => Array        (            [2013-04-01 14:00:00] => 74            [2013-04-01 15:00:00] => 289            [2013-04-01 16:00:00] => 242            [2013-04-01 17:00:00] => 211            [2013-04-01 18:00:00] => 228            [2013-04-01 19:00:00] => 99        ))
查询出来的数据要求按照图表显示,但是每个时间点都要显示,数据库里边没有的时间要填充为0。

最后听广哥建议,用下面的方法实现。

-----------------------------------------------------------------------------------------------------------------

$startTime=date('Y-m-d H:00:00',  strtotime($stime));        $arr=array();//先创建所有时间点值都为0的一个数组        $temp=0;        for($i=$startTime;  strtotime($i)<strtotime($etime);$i=date("Y-m-d H:i:s", strtotime("$i +1 hours"))){            $arr[$i]=0;            $temp++;        }        foreach ($data as $key=>$value) {//用array_merge()合并数组            $arr_temp=array_merge($arr,$value);            $data[$key]=$arr_temp;        }
此处附array_merge()的方法说明:

array array_merge ( array array1 [, array array2 [, array ...]] )array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。