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

如何在php中按键值合并两个多维数组?,php,arrays,multidimensional-array,array-merge,array-replace,Php,Arrays,Multidimensional Array,Array Merge,Array Replace,我有两个数组 $arr1 = [ ['month' => 1], ['month' => 2], ['month' => 3], ['month' => 4] ]; $arr2 = [ ['month' => 3, 'info' => 'Alpha'], ['month' => 4, 'info' => 'Beta'] ]; 我尝试过array\u merge&array\u merge\

我有两个数组

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

$arr2 = [
    ['month' => 3, 'info' => 'Alpha'], 
    ['month' => 4, 'info' => 'Beta']
];
我尝试过
array\u merge
&
array\u merge\u recursive
这两种方法都没有像我预期的那样合并数组

预期合并:

$arr3 = [
    ['month' => 1], 
    ['month' => 2], 
    ['month' => 3, 'info' => 'Alpha'], 
    ['month' => 4, 'info' => 'Beta']
];
数组合并递归的实际值为:

$arr3=array\u merge\u recursive($arr2,$arr1)


你可以试试下面的代码

$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);

如果数组在月份关联,则可以使用数组替换。
首先使数组与array_列关联,然后用$arr2值替换$arr1

$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"
  }
}

如果您有旧版本的PHP,它没有array_列,那么您可以从手册中使用它

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;
    }
}

在本例中,我遍历数组并构造所需的输出

$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);

如果
$arr2
中有
$arr1
中不存在的元素,该怎么办?如果要添加$arr1中不存在的元素,可以使用else{$newArr[$arr[$arr['month']=['month'=>$arr['month']];}将其添加到$newArr中亲爱的@Andreas,感谢您的回复,不幸的是,我的服务器上有PHP 5.3。因此,我无法使用array_列。@KarthikeyanRaju使用手册中的遗留代码,效果很好:。array_列是一个非常方便的函数。亲爱的@Andreas,非常感谢您为我的问题所做的努力。再次非常感谢。@KarthikeyanRaju没问题。我建议您在项目中实现array_列,即使您不使用我的答案,这是一个非常好的函数。亲爱的@ryantxr,它对我很有用,谢谢,尽管我是Stack Overflow中的新注册用户,但我无法对正确答案进行投票。
$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);