
本文介绍如何在 PHP 中对包含日期和计数值的二维数组进行去重与聚合:将相同日期的 viewscount 值相加,保留唯一日期项,最终输出结构清晰、键重置的汇总数组。
本文介绍如何在 php 中对包含日期和计数值的二维数组进行去重与聚合:将相同日期的 `viewscount` 值相加,保留唯一日期项,最终输出结构清晰、键重置的汇总数组。
在实际开发中(如统计每日页面浏览量、用户行为日志归总等场景),我们常会遇到结构类似如下的一维数组,其中每个子数组包含 'date' 和 'viewscount' 字段:
$data = [
['viewscount' => 18, 'date' => '2022-07-14'],
['viewscount' => 19, 'date' => '2022-07-18'],
['viewscount' => 1, 'date' => '2022-07-19'],
['viewscount' => 1, 'date' => '2022-08-03'],
['viewscount' => 1, 'date' => '2022-08-03'],
];
目标是:按 'date' 字段分组,对同日期的所有 'viewscount' 求和,并合并为一条记录。即:2022-08-03 出现两次,对应 viewscount 分别为 1 和 1,应合并为 viewscount => 2。
✅ 实现思路
核心策略是使用 日期字符串作为临时关联键(associative key) 构建索引数组 $indexed:
- 遍历原始数组
$data; - 若当前日期
$record['date']已存在于$indexed中,则累加viewscount; - 否则,以该日期为键,完整复制当前记录;
- 最后调用
array_values()重置数字索引,确保输出为标准有序数组。
✅ 完整可运行代码
<?php $data = [
['viewscount' => 18, 'date' => '2022-07-14'],
['viewscount' => 19, 'date' => '2022-07-18'],
['viewscount' => 1, 'date' => '2022-07-19'],
['viewscount' => 1, 'date' => '2022-08-03'],
['viewscount' => 1, 'date' => '2022-08-03'],
];
$indexed = [];
foreach ($data as $record) {
$date = $record['date'];
if (isset($indexed[$date])) {
$indexed[$date]['viewscount'] += $record['viewscount'];
} else {
$indexed[$date] = $record;
}
}
$result = array_values($indexed);
print_r($result);
?>
✅ 输出结果:
Array
(
[0] => Array
(
[viewscount] => 18
[date] => 2022-07-14
)
[1] => Array
(
[viewscount] => 19
[date] => 2022-07-18
)
[2] => Array
(
[viewscount] => 1
[date] => 2022-07-19
)
[3] => Array
(
[viewscount] => 2
[date] => 2022-08-03
)
)
⚠️ 注意事项
-
键存在性判断推荐
isset()而非array_key_exists():因isset()更高效且能避免对null值的误判;本例中viewscount均为正整数,安全可靠。 -
日期格式需严格一致:若原始数据中存在
'2022/08/03'或'08-03-2022'等变体,需先统一标准化(例如用date('Y-m-d', strtotime($date))格式化)。 -
扩展性提示:如需同时聚合多个字段(如
clicks,impressions),可在else分支初始化全字段,在if分支中分别累加,逻辑保持一致。 -
性能考量:该方案时间复杂度为 O(n),适用于万级以内数据;超大数据量建议改用数据库
GROUP BY date SUM(viewscount)原生聚合。
通过这种基于关联键的聚合方式,你无需依赖额外扩展或复杂函数,即可简洁、高效、可读性强地完成日期维度的数据归总任务。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











