问题描述
工作中,我们有时候会需要用图表的形式来展示一些数据,但是在实际操作中可能碰到一些问题
例如在展示月度数据时(202001,202002),有些月份没有数据,那么用sql查询出来后时没办法只用一张表来给不存在的月份默认给个0
网络上大部分的处理办法是额外做一张月份列表,在表中插入N年的数据,这当然是没有问题的,但是凡事肯定有不同的解决办法,所以今天自己用PHP后端试着实现了一下基本效果,作为逻辑参考。
代码逻辑
一般肯定需要我们后端直接将数据处理成 [‘month’=>res_num] 这种月份为键,数据为值的json格式传递给前端做数据渲染,今天虽然是PHP来做代码实现,但是同样的逻辑也可以前端js来做数据处理,道理是相通的。
这里用的是一个笨办法,从数据库中查询出原始数据,将数据做循环处理,然后处理循环出来的月份的前一月和后一月,判断原始数据中是否有该月份数据,没有则插入数据,值为0,之后将结果数据做一个键排序,这里有一个问题是没有做判断所以会导致首月之前一个月也会插入进入,不需要的话给数组做一个array_shift(删除数组中的第一个元素,并返回被删除元素的值)
代码
//源数据
$data = ['202001'=>12,'202002'=>20,'202004'=>5];
//循环
foreach ($data as $key => $value) {
//当前月
$month = substr($key, strlen($key)-2);
//当前年
$year = $last_y = $next_y = substr($key, 0,-2);
//上月数据
$last_m = $month-1;
// 月份是否跑到去年
if($last_m < 1){
$last_m = 12;
$last_y = $year-1;
}
//格式化上月
$last_month = $last_y.formal_month($last_m);
//判断是否存在
if(!array_key_exists($last_month, $data)) $data[$last_month] = 0;
//下月数据
$next_m = $month+1;
// 月份是否跑到明年
if($next_m > 12){
$next_m = 1;
$next_y = $year+1;
}
$next_month = $next_y.formal_month($next_m);
if(!array_key_exists($next_month, $data)) $data[$next_month] = 0;
}
//格式化月份
function formal_month($month){
$res = ($month<10) ? '0'.$month : $month;
return $res;
}
//数组键排序
ksort($data);
//打印数据
echo "<pre>";
var_dump($data);
原始数据
array(3) {
[202001]=>
int(12)
[202002]=>
int(20)
[202004]=>
int(5)
}
结果数据
array(6) {
[201912]=>
int(0)
[202001]=>
int(12)
[202002]=>
int(20)
[202003]=>
int(0)
[202004]=>
int(5)
[202005]=>
int(0)
}
这里只是分享下实现逻辑,后续可以根据业务需要做优化以及封装函数处理。