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

PHP二维数组按日期年月分组统计数量的代码逻辑修正

问题:按年月分组统计二维数组记录数

现有如下PHP代码,试图将包含date_starts字段的二维数组按日期的年月分组,并统计每组的记录数:

$avaDates = [
    ['date_starts' => '2024-03-01'],
    ['date_starts' => '2024-03-09'],
    ['date_starts' => '2024-04-05'],
    ['date_starts' => '2024-04-09'],
    ['date_starts' => '2024-04-15'],
    ['date_starts' => '2024-05-03']
];
$sum = 0;
$months = '';
foreach ($avaDates as $date) {
    $monthCheck = substr($date['date_starts'], 0, -3);
    if ($months !== $monthCheck) {
        $months = $monthCheck;
        $dateFormat = date("F-Y", strtotime($months));

        echo strtolower($dateFormat) . ' ' . $sum . "\n";

        $sum = 0;
    }
    $sum++;
}

当前实际输出:

march-2024 0
april-2024 2
may-2024 3

期望输出:

march-2024 2
april-2024 3
may-2024 1

问题分析

原代码逻辑存在两个核心问题:

  1. 遇到新月份时立即输出统计数,但此时输出的是上一组未完成的统计值(第一次循环时sum初始为0,直接输出导致3月统计数错误);
  2. 循环结束后未处理最后一组月份的统计输出,导致最后一组的实际统计数被遗漏。

修正方案

方案一:先构建统计数组再输出(更直观易维护)

通过数组先存储每个月份的统计结果,再遍历输出,逻辑更清晰:

$avaDates = [
    ['date_starts' => '2024-03-01'],
    ['date_starts' => '2024-03-09'],
    ['date_starts' => '2024-04-05'],
    ['date_starts' => '2024-04-09'],
    ['date_starts' => '2024-04-15'],
    ['date_starts' => '2024-05-03']
];

// 初始化统计数组
$monthStats = [];

foreach ($avaDates as $date) {
    // 提取年月部分(如2024-03)
    $yearMonth = substr($date['date_starts'], 0, 7);
    // 转换为目标格式(如march-2024)
    $formattedMonth = strtolower(date("F-Y", strtotime($yearMonth)));
    
    // 累加统计数量
    if (!isset($monthStats[$formattedMonth])) {
        $monthStats[$formattedMonth] = 0;
    }
    $monthStats[$formattedMonth]++;
}

// 遍历输出结果
foreach ($monthStats as $month => $count) {
    echo "$month $count\n";
}

方案二:修正原循环逻辑

调整循环内的判断顺序,先完成当前组的统计,再切换月份时输出上一组结果,最后补充输出最后一组:

$avaDates = [
    ['date_starts' => '2024-03-01'],
    ['date_starts' => '2024-03-09'],
    ['date_starts' => '2024-04-05'],
    ['date_starts' => '2024-04-09'],
    ['date_starts' => '2024-04-15'],
    ['date_starts' => '2024-05-03']
];

$sum = 0;
$currentMonth = '';

foreach ($avaDates as $date) {
    $monthCheck = substr($date['date_starts'], 0, -3);
    
    // 仅当已存在当前月份且切换到新月份时,输出上一组统计
    if ($currentMonth !== '' && $currentMonth !== $monthCheck) {
        $dateFormat = strtolower(date("F-Y", strtotime($currentMonth)));
        echo "$dateFormat $sum\n";
        $sum = 0;
    }
    
    $currentMonth = $monthCheck;
    $sum++;
}

// 输出最后一组月份的统计结果
if ($currentMonth !== '') {
    $dateFormat = strtolower(date("F-Y", strtotime($currentMonth)));
    echo "$dateFormat $sum\n";
}

两种方案均可得到期望输出:

march-2024 2
april-2024 3
may-2024 1

内容的提问来源于stack exchange,提问作者Ered

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:50:21