PHP遍历双数组匹配日期合并数组并更新值的问题
数组合并问题:嵌套foreach循环未修改原数组的解决方案
问题场景
需要合并两个数组生成目标数组:
- Array1:包含当月所有日期,
result值均为0 - Array2:仅包含带有数值的日期及对应
result值 - 需求:日期匹配时使用Array2的
result值,否则保留Array1的0值
但使用嵌套foreach循环后,Array1未发生任何变化。
数组示例
Array1 ( [0] => Array ( [date] => 2022-12-01 [result] => 0 ) [1] => Array ( [date] => 2022-12-02 [result] => 0 ) [2] => Array ( [date] => 2022-12-03 [result] => 0 ) . . . [31] => Array ( [date] => 2022-12-31 [result] => 0 ) ) Array2 ( [0] => Array ( [date] => 2022-12-01 [result] => 45 ) [1] => Array ( [date] => 2022-12-03 [result] => 15 ) . . . [25] => Array ( [date] => 2022-12-31 [result] => 25 ) ) 目标Array3 ( [0] => Array ( [date] => 2022-12-01 [result] => 45 ) [1] => Array ( [date] => 2022-12-02 [result] => 0 ) [2] => Array ( [date] => 2022-12-03 [result] => 15 ) . . . [31] => Array ( [date] => 2022-12-31 [result] => 25 ) )
用户错误代码
foreach($Array1 as $arr1){ foreach($Array2 as $arr2){ if($arr1['date'] == $arr2['date']){ $arr1['date'] = $arr2['date']; $arr1['result'] = $arr2['result']; } } }
问题原因
PHP的foreach默认采用值传递,循环中的$arr1是原数组元素的副本,修改副本不会影响原Array1的内容。此外嵌套foreach的时间复杂度为O(n*m),数据量大时效率较低。
解决方案
方案1:使用引用传递修改原数组
将foreach循环中的$arr1改为引用(添加&符号),这样修改的就是原数组的元素而非副本。同时添加break跳出内层循环,避免不必要的遍历:
foreach($Array1 as &$arr1){ foreach($Array2 as $arr2){ if($arr1['date'] == $arr2['date']){ $arr1['result'] = $arr2['result']; break; // 找到匹配后立即终止内层循环,提升效率 } } } unset($arr1); // 必须释放引用,防止后续操作意外修改数组
方案2:重构数组为键值映射(更高效)
先将Array2转换为以date为键的映射数组,再遍历Array1直接通过键查找匹配值,时间复杂度优化为O(n+m),适合数据量较大的场景:
// 把Array2转为日期=>结果的映射数组 $dateResultMap = []; foreach($Array2 as $item){ $dateResultMap[$item['date']] = $item['result']; } // 生成目标Array3 $Array3 = []; foreach($Array1 as $item){ $currentDate = $item['date']; $Array3[] = [ 'date' => $currentDate, 'result' => isset($dateResultMap[$currentDate]) ? $dateResultMap[$currentDate] : 0 ]; }
内容的提问来源于stack exchange,提问作者Francis.C
相关产品推荐
相关产品推荐

