【问题标题】:How to merge two multi dimensional arrays by key value in php?如何在php中通过键值合并两个多维数组?
【发布时间】:2019-10-07 00:04:56
【问题描述】:

我有两个数组

$arr1 = [
    ['month' => 1], 
    ['month' => 2], 
    ['month' => 3], 
    ['month' => 4]
];

$arr2 = [
    ['month' => 3, 'info' => 'Alpha'], 
    ['month' => 4, 'info' => 'Beta']
];

我已经尝试过 array_mergearray_merge_recursive 两者都没有像我预期的那样合并数组。

预期合并:

$arr3 = [
    ['month' => 1], 
    ['month' => 2], 
    ['month' => 3, 'info' => 'Alpha'], 
    ['month' => 4, 'info' => 'Beta']
];

array_merge_recursive 的实际是:

$arr3 = array_merge_recursive($arr2, $arr1);

$arr3 = [
    ['month' => 3, 'info' => 'Alpha'], 
    ['month' => 4, 'info' => 'Beta']
    ['month' => 1], 
    ['month' => 2], 
    ['month' => 3], 
    ['month' => 4]
];

【问题讨论】:

    标签: php arrays multidimensional-array array-merge array-replace


    【解决方案1】:

    如果数组在月份是关联的,那么您可以使用 array_replace。
    首先使数组与 array_column 关联,然后将 $arr1 替换为 $arr2 值。

    $arr1 = [
        ['month' => 1], 
        ['month' => 2], 
        ['month' => 3], 
        ['month' => 4]
    ];
    
    $arr2 = [
        ['month' => 3, 'info' => 'Alpha'], 
        ['month' => 4, 'info' => 'Beta'],
        ['month' => 1, 'info' => 'Gamma'],
    ];
    
    
    $arr1 = array_column($arr1, null, 'month');
    $arr2 = array_column($arr2, null, 'month');
    
    $result = array_replace($arr1, $arr2);
    var_dump($result);
    

    返回:

    array(4) {
      [1]=>
      array(2) {
        ["month"]=>
        int(1)
        ["info"]=>
        string(5) "Gamma"
      }
      [2]=>
      array(1) {
        ["month"]=>
        int(2)
      }
      [3]=>
      array(2) {
        ["month"]=>
        int(3)
        ["info"]=>
        string(5) "Alpha"
      }
      [4]=>
      array(2) {
        ["month"]=>
        int(4)
        ["info"]=>
        string(4) "Beta"
      }
    }
    

    https://3v4l.org/tpshB

    如果您有没有 array_column 的旧版本 PHP,那么您可以使用手册中的 legacy code

    if (!function_exists('array_column')) {
        function array_column($array, $columnKey, $indexKey = null)
        {
            $result = array();
            foreach ($array as $subArray) {
                if (is_null($indexKey) && array_key_exists($columnKey, $subArray)) {
                    $result[] = is_object($subArray)?$subArray->$columnKey: $subArray[$columnKey];
                } elseif (array_key_exists($indexKey, $subArray)) {
                    if (is_null($columnKey)) {
                        $index = is_object($subArray)?$subArray->$indexKey: $subArray[$indexKey];
                        $result[$index] = $subArray;
                    } elseif (array_key_exists($columnKey, $subArray)) {
                        $index = is_object($subArray)?$subArray->$indexKey: $subArray[$indexKey];
                        $result[$index] = is_object($subArray)?$subArray->$columnKey: $subArray[$columnKey];
                    }
                }
            }
            return $result;
        }
    }
    

    【讨论】:

    • 亲爱的@Andreas,感谢您的回复,不幸的是我的服务器上有 PHP 5.3。所以,我无法使用 array_column。
    • @KarthikeyanRaju 使用手册中的旧代码可以正常工作:3v4l.org/qEpZW。 Array_column 是一个非常方便的函数。
    • 亲爱的@Andreas,非常感谢您为我的问题所做的努力。再次非常感谢。
    • @KarthikeyanRaju 没问题。我建议你在你的项目中实现array_column,即使你不使用我的答案,这是一个非常好的功能。
    【解决方案2】:

    在这种情况下,我遍历数组并构造所需的输出。

    $output = [];
    $allMerged = array_merge($arr1, $arr2);
    array_walk($allMerged, 
      function($item, $key) use (&$output) {
        print_r($item);
        if ( array_key_exists($item['month'], $output) ) {
            if ( isset($item['info']) ) {
                $output[$item['month']]['info'] = $item['info'];
            } else {
                $output[$item['month']] = $item;
            }
        } else {
            $output[$item['month']] = $item;
        }
    });
    print_r($output);
    

    【讨论】:

    • 亲爱的@ryantxr,它对我有用,谢谢,虽然我是 Stack Overflow 中的新注册用户,但我无法投票正确答案。
    【解决方案3】:

    你可以试试下面的代码

    $newArr = [];
    foreach($arr1 as $row) {
        $newArr[$row['month']] = $row;
    }
    foreach($arr2 as $arr) {
        if(array_key_exists($arr['month'], $newArr)) {
            $newArr[$arr['month']]['info'] = $arr['info'];
        }
    } 
    
    print_r($newArr);
    

    【讨论】:

    • 如果$arr2$arr1 中不存在的元素怎么办?
    • 如果你想添加 $arr1 中不存在的元素,你可以使用 else { $newArr[$arr['month'] = ['month' => $arr[ '月'] ]; }
    猜你喜欢
    • 1970-01-01
    • 2014-02-11
    • 2011-06-12
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2021-03-05
    相关资源
    最近更新 更多