php连续数组,使用原生PHP基于不连续数组生成连续数组函数参考

这篇博客介绍了如何在PHP中利用原生方法处理时间数据,特别是针对用户步数统计的问题。当需要从已有数据生成一个指定日期范围内的完整数组时,避免使用第三方库如Carbon,而是通过DateTime类来创建日期范围,并填充缺失的日期数据,将total值设为0。这种方法展示了在处理时间序列数据时的一种实用技巧。
摘要由CSDN通过智能技术生成

PHP自带了非常强大的时间处理功能。

假如有一个用户每日步数统计数据的数组:

$userStepReports = [

[

'date' => '2017-02-06',

'total' => 652,

],

[

'date' => '2017-03-01',

'total' => 773,

],

[

'date' => '2017-03-02',

'total' => 459,

],

];

如果需要生成一个用户从2月1号到3月29号的步数统计折线图,因为一些图表控件的限制,我们必须传递一个有57天数据的大数组,否则会生成一个只有3列数据的图表。这种情况下,我们就得基于已有的数组去补足出一个大数组,没有的就添加一个total等于0的数据。

很多同学会立马想起Carbon这个库,但这里我们用原生方法实现,实际也并不复杂,代码参考如下:

function getDataInTimeSpan($input, $startDate, $endDate, $dateProperty, $default)

{

$start = new \DateTime($startDate);

$end = new \DateTime($endDate);

if ($start->diff($end)->invert === 1) {

throw new \LogicException('开始时间不能大于结束时间');

}

$keyedInput = [];

foreach ($input as $value) {

$keyedInput[$value[$dateProperty]] = $value;

}

$endAt = (clone $end)->modify('+1 day')->format('Y-m-d');

$current = clone $start;

$output = [];

while (($currentDate = $current->format('Y-m-d')) !== $endAt) {

// 这里用了PHP 7的新操作符

$output[] = $keyedInput[$currentDate] ?? array_merge($default, [

$dateProperty => $currentDate,

]);

$current->modify('+1 day');

}

return $output;

}

$userStepReports = [

[

'date' => '2017-02-06',

'total' => 652,

],

[

'date' => '2017-03-01',

'total' => 773,

],

[

'date' => '2017-03-02',

'total' => 459,

],

];

$reports = getDataInTimeSpan(

$userStepReports,

'2017-02-01',

'2017-03-29',

'date',

['total' => 0]

);

延伸阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值