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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:10:19