PHP自带了非常强大的时间处理功能。
假如有一个用户每日步数统计数据的数组:
<?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
这个库,但这里我们用原生方法实现,实际也并不复杂,代码参考如下:
<?php
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]
);