如何在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);