如何在php中通过键值合并两个多维数组?

Posted

技术标签:

【中文标题】如何在php中通过键值合并两个多维数组?【英文标题】:How to merge two multi dimensional arrays by key value in 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]
];

【问题讨论】:

【参考方案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[ '月'] ];

以上是关于如何在php中通过键值合并两个多维数组?的主要内容,如果未能解决你的问题,请参考以下文章

项目中阶梯费率解决方法,数组中通过键名查找键值

如何在PHP中通过分隔符将字符串分解为多维数组

使用PHP检查多维数组中是否存在键值

使用带有 sql 的键值对搜索 php 多维关联数组,例如 '%LIKE%' 构造

Laravel PHP通过多个键值过滤多维数组

PHP编程实现多维数组按照某个键值排序的方法