PHP实现数组按日期分组统计 从首日起按日计数生成结果数组
PHP实现按日期分组统计代码
实现思路
我们先对齐你给出的示例输出逻辑:统计第一条数据所属自然月的每日数据量,数组索引从0开始对应当月1号,无数据的日期计数为0:
- 校验原始数组非空,避免空数组报错
- 提取第一条数据的创建时间,解析得到所属年月,计算当月总天数
- 初始化结果数组,长度等于当月总天数,默认值全为0
- 遍历所有原始数据,将每条数据的创建时间转换为当月第几日,对应索引位置计数+1
完整代码
<?php // 你的原始数组 $data = [ [ 'id' => '1', 'date_created' => '2021-11-14T23:22:53.558225+00:00', ], [ 'id' => '2', 'date_created' => '2021-11-14T23:22:00.558225+00:00', ], [ 'id' => '3', 'date_created' => '2021-11-15T11:22:53.558225+00:00', ], ]; $new_array = []; if (!empty($data)) { // 解析第一条数据的日期,获取所属年月 $firstDate = new DateTime($data[0]['date_created']); $yearMonth = $firstDate->format('Y-m'); // 获取当月总天数 $daysInMonth = cal_days_in_month(CAL_GREGORIAN, $firstDate->format('m'), $firstDate->format('Y')); // 初始化结果数组,全为0 $new_array = array_fill(0, $daysInMonth, 0); // 遍历所有数据统计 foreach ($data as $item) { $currentDate = new DateTime($item['date_created']); // 只统计和第一条同月的数据,可根据需求去掉该判断 if ($currentDate->format('Y-m') === $yearMonth) { $dayOfMonth = $currentDate->format('j'); // 日期转索引:1号对应索引0,所以减1 $index = $dayOfMonth - 1; $new_array[$index]++; } } } // 输出结果 print_r($new_array); ?>
输出结果
针对你给出的测试数据,输出结果和示例完全一致,数组前13位(对应11月1日到13日)都是0,第14位(对应11月14日)为2,第15位(对应11月15日)为1。
如果你需要的是从第一条数据的日期开始,到最后一条数据的日期为止,跨月也连续按天统计,可以用以下版本的代码:
<?php $data = [ [ 'id' => '1', 'date_created' => '2021-11-14T23:22:53.558225+00:00', ], [ 'id' => '2', 'date_created' => '2021-11-14T23:22:00.558225+00:00', ], [ 'id' => '3', 'date_created' => '2021-11-15T11:22:53.558225+00:00', ], ]; $new_array = []; if (!empty($data)) { // 提取所有日期的Y-m-d格式,统计每日数量 $countMap = []; $minDate = new DateTime($data[0]['date_created']); $maxDate = new DateTime($data[0]['date_created']); foreach ($data as $item) { $currentDate = new DateTime($item['date_created']); $dateKey = $currentDate->format('Y-m-d'); $countMap[$dateKey] = isset($countMap[$dateKey]) ? $countMap[$dateKey] + 1 : 1; // 更新最小和最大日期 if ($currentDate < $minDate) $minDate = $currentDate; if ($currentDate > $maxDate) $maxDate = $currentDate; } // 从最小日期到最大日期遍历,填充结果 $current = (clone $minDate)->setTime(0,0,0); $max = (clone $maxDate)->setTime(0,0,0); while ($current <= $max) { $dateKey = $current->format('Y-m-d'); $new_array[] = $countMap[$dateKey] ?? 0; $current->modify('+1 day'); } } print_r($new_array); ?>
该版本针对你的测试数据输出为[2,1]。
内容的提问来源于stack exchange,提问作者Васили
相关产品推荐
相关产品推荐

