You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Васили

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:24:01