如何在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_merge
和 array_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中通过键值合并两个多维数组?的主要内容,如果未能解决你的问题,请参考以下文章