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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:27:27