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
问题分析
原代码逻辑存在两个核心问题:
- 遇到新月份时立即输出统计数,但此时输出的是上一组未完成的统计值(第一次循环时
sum初始为0,直接输出导致3月统计数错误); - 循环结束后未处理最后一组月份的统计输出,导致最后一组的实际统计数被遗漏。
修正方案
方案一:先构建统计数组再输出(更直观易维护)
通过数组先存储每个月份的统计结果,再遍历输出,逻辑更清晰:
$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
相关产品推荐
相关产品推荐

