PHP foreach循环组装图表二维数组时Overdue字段始终为0
问题原因
核心bug是同月份多状态数据遍历互相覆盖:
- 你当前的循环每处理一条数据,无论这条数据对应什么状态,都会先把当前月份的Paid、Overdue、Due三个值全部重置为0,再给当前记录对应的状态赋值
- 当同一个月份存在多条不同状态的记录时,后遍历到的记录会把之前已经设置好的非0状态值重新冲为0。举个例子:2022-04同时存在Overdue、Due两条记录,先遍历到Overdue记录时你把对应值设为51,之后遍历到同月份Due记录时,代码又会执行
$chart["Overdue"]["2022-04"] = 0,直接把刚设置的51覆盖掉,这就是Overdue数组最终全为0的根本原因 - 存在额外隐藏问题:同月份的多条记录会重复执行Label数组的追加操作,导致Label里出现重复月份,不符合图表的维度展示要求
修复方案
调整逻辑顺序:所有月份的默认0值只在月份首次出现时初始化一次,后续遍历只更新当前记录对应状态的数值,从根源避免值被覆盖。
修复后的代码如下:
// 先初始化图表数组的四个根键结构 $chart = [ 'Label' => [], 'Paid' => [], 'Overdue' => [], 'Due' => [] ]; foreach ($results as $data) { // 仅当月份第一次出现时,才初始化该月份三个状态的默认值、追加Label if (!in_array($data->monthly, $chart['Label'])) { $chart['Label'][] = $data->monthly; $chart['Paid'][$data->monthly] = 0; $chart['Overdue'][$data->monthly] = 0; $chart['Due'][$data->monthly] = 0; } // 只更新当前记录对应状态的数值,不会重置其他状态的已存值 $chart[$data->status][$data->monthly] = $data->total_invoices; } return $chart;
修复后效果
- 所有月份首次出现时会自动将三类账单状态的默认值设为0,满足无数据位置填0的需求
- 同月份不同状态的记录只会更新对应状态的数值,不会覆盖其他状态已经设置好的非0值
- Label数组不会出现重复月份,符合图表展示的维度要求
- 你预期的Overdue数组非0值会被正确保留,不会被异常重置为0
内容的提问来源于stack exchange,提问作者Ajay Kumar Chawla
相关产品推荐
相关产品推荐

