PHP 补齐查询区间日期中缺少的日期数据
前言
本文是自己在进行项目编写时遇到的情况,特此记录,以便下次遇到可以以此借鉴。
一、功能需求
本次需要实现的功能是为了配合前端实现柱状图以及条形图,而去处理出柱状图所需要的补齐区间日期中缺少的数据。
二、使用到的函数及方法
1.PHP内置函数 array_column()
定义:array_column() 返回输入数组中某个单一列的值。
使用方法:array_column(array,column,index);//array是指处理的数组、column是指需要取出得列,这两个是必需的、index作为返回数组的索引/键的列,可选。
<?php
$data = [
[
"order_num"=> 1,
"today_pay"=>"10.00",
"dateymd"=>'2022-8-1'
],
[
"order_num"=> 2,
"today_pay"=>"20.00",
"dateymd"=>'2022-8-2'
],
];
$dateymd = array_column($data, 'dateymd');//
print_r($dateymd);
?>
输出:[
0 => ‘2022-8-1’,
1 => ‘2022-8-2’
]
2.PHP内置函数 array_multisort()
定义:array_multisort()返回一个有序的数组。
使用方法:array_multisort(array,sorting order,sorting type) //array是指需处理的数组,可以再加上数组,将会按顺序对数组进行排序、sorting order规定排列顺序、sorting type规定排序类型。
<?php
$arr=[11,3,5,17,22];
array_multisort($arr,SORT_ASC,SORT_NUMERIC);
print_r($arr);
?>
输出:
[
0 => 3,
1 => 5,
2 => 11,
3 => 17,
4 => 22
]
3.CompletionDate 方法
补全时间段的日期
//补全日期
function CompletionDate($from, $to)
{
//定义一个空数组
$date = [];
//将字符串转换为时间戳
$from = strtotime($from);
$to = strtotime($to);
while ($from <= $to) {
//将时间装进$date数组
$date[] += $from;
$from = strtotime('+1 day', $from);
}
//&的使用可以改变原来元素的值,这里也就是将$date里的时间戳全部转换为字符串的时间
foreach ($date as &$value) {
$value = date('Y-m-d', $value);
}
return $date;
}
4.duplicate 方法
数组根据键去重
//按键去重
function duplicate($list,$key)
{
//定义两个空数组
$res = [];
$keys = [];
foreach($list as $item){
//in_array(string,array) 判断string是否在array中
if(!in_array($item[$key],$keys)){
//array_push(array,string) 将string添加至array的最后
array_push($res,$item);
array_push($keys,$item[$key]);
}
}
return $res;
}
三、代码实现
<?php
$alldate = CompletionDate($from,$to);//间隔所有日期
$time = [];
foreach ($data as $v) {
//数据库有的
$time = array_merge($time,[$v['dateymd']]);
}
foreach ($alldate as $all){
if (!in_array($all,$time)){
//将数据库查出没有的日期插入$data中
array_push($data,["order_num"=> 0, "today_pay"=>"0.00", "dateymd"=>$all]);
}
}
$dateymd = array_column($data,'dateymd');
array_multisort($dateymd,SORT_ASC,$data);
$data = duplicate($data,'dateymd');
?>
总结
以上就是我实现功能的所有代码,其中也是借鉴了不少其他的文章才实现,实现方式可能不是最好的,但也是一种解决问题的思路。
参考:PHP 数组按某个值排序
参考:PHP 补全日期区间中缺少的日期