PHP 补齐查询区间日期中缺少的日期数据

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 补全日期区间中缺少的日期

猜你喜欢

转载自blog.csdn.net/SupremeT_T/article/details/126420068