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
相关产品推荐
相关产品推荐

