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

PHP全年月度收入数组补全:数据库数据替换默认值异常问题

问题分析与解决方法

问题根源

你的嵌套循环逻辑存在漏洞:当处理Sep-2022时,第一次遍历$dbdata匹配到对应数据,将$net设为1864,但紧接着会遍历到Oct-2022的数据库数据,此时不匹配,代码执行else分支,把$net重新覆盖为原月份的0,最终导致Sep的数值被重置。只有Oct的月份因为是数据库数组的最后一项,匹配后没有后续循环覆盖,所以数值正确。

解决方案1:修改循环逻辑,匹配后跳出内层循环

调整代码,先默认使用初始化的0值,找到匹配的数据库数据后更新数值,并立即跳出内层循环,避免后续循环覆盖正确值:

foreach ($months as $key) {
    // 先默认使用初始的0值
    $net = $key['income'];
    $dates = $key['dates'];
    foreach ($dbdata as $db) {
        if ($key['dates'] === $db['dates']) {
            $net = $db['income'];
            $dates = $db['dates'];
            // 找到匹配项后立即终止内层循环,防止后续覆盖
            break;
        }
    }
    $graphData[] = array('dates' => $dates, 'income' => $net);
}
if ($graphData) {
    echo json_encode($graphData);
}

解决方案2:转换数据库数据为关联数组,优化查找效率

先将数据库返回的数据转换成以dates为键的关联数组,这样无需嵌套循环,直接通过键名快速匹配,逻辑更清晰且效率更高:

// 把数据库数据转为以日期为键的关联数组
$dbIncomeMap = [];
foreach ($dbdata as $item) {
    $dbIncomeMap[$item['dates']] = $item['income'];
}

// 遍历初始化的月份数组,替换对应收入值
$graphData = [];
foreach ($months as $monthItem) {
    $income = isset($dbIncomeMap[$monthItem['dates']]) ? $dbIncomeMap[$monthItem['dates']] : $monthItem['income'];
    $graphData[] = [
        'dates' => $monthItem['dates'],
        'income' => $income
    ];
}

echo json_encode($graphData);

这种方式将时间复杂度从O(n*m)降低到O(n+m),数据量越大,性能优势越明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:11:54