Php 合并并覆盖两个或多个多维数组
如何使用array\u merge\u recursive合并和覆盖具有相同键和值的多维数组?假设我有两个数组,如下所示:Php 合并并覆盖两个或多个多维数组,php,multidimensional-array,overwrite,array-merge,Php,Multidimensional Array,Overwrite,Array Merge,如何使用array\u merge\u recursive合并和覆盖具有相同键和值的多维数组?假设我有两个数组,如下所示: $arr1 = array( // OVERWRITE array('prop_id' => 1, 'prop_value' => 'batman'), array('prop_id' => 2, 'prop_value' => 'ironman'), // NOT OVERWRITE array('pro
$arr1 = array(
// OVERWRITE
array('prop_id' => 1, 'prop_value' => 'batman'),
array('prop_id' => 2, 'prop_value' => 'ironman'),
// NOT OVERWRITE
array('prop_id' => 5, 'prop_value' => 'wonderwoman'),
);
$arr2 = array(
array('prop_id' => 1, 'prop_value' => 'robin'),
array('prop_id' => 2, 'prop_value' => 'superman'),
array('prop_id' => 4, 'prop_value' => 'catwoman'),
);
$result = array_replace_recursive(
array(
1 => array('prop_id' => 1, 'prop_value' => 'batman'),
2 => array('prop_id' => 2, 'prop_value' => 'ironman'),
5 => array('prop_id' => 5, 'prop_value' => 'wonderwoman'),
),
array(
1 => array('prop_id' => 1, 'prop_value' => 'robin'),
2 => array('prop_id' => 2, 'prop_value' => 'superman'),
4 => array('prop_id' => 4, 'prop_value' => 'catwoman'),
),
);
我想合并并用新值覆盖它(规则是比较键,与它没有覆盖的值相同),预期结果是
$result = array_merge_overwrite($arr1, $arr2, array('prop_id') /* Comparison Key */);
$result = array(
array('prop_id' => 1 /* Comparison Key */, 'prop_value' => 'robin' /* Comparison value */),
array('prop_id' => 2, 'prop_value' => 'superman'),
array('prop_id' => 4, 'prop_value' => 'catwoman'),
array('prop_id' => 5, 'prop_value' => 'wonderwoman'),
);
使用array\u merge\u recursive,它不会被覆盖,我尝试使用array\u replace\u recursive,如下所示:
$arr1 = array(
// OVERWRITE
array('prop_id' => 1, 'prop_value' => 'batman'),
array('prop_id' => 2, 'prop_value' => 'ironman'),
// NOT OVERWRITE
array('prop_id' => 5, 'prop_value' => 'wonderwoman'),
);
$arr2 = array(
array('prop_id' => 1, 'prop_value' => 'robin'),
array('prop_id' => 2, 'prop_value' => 'superman'),
array('prop_id' => 4, 'prop_value' => 'catwoman'),
);
$result = array_replace_recursive(
array(
1 => array('prop_id' => 1, 'prop_value' => 'batman'),
2 => array('prop_id' => 2, 'prop_value' => 'ironman'),
5 => array('prop_id' => 5, 'prop_value' => 'wonderwoman'),
),
array(
1 => array('prop_id' => 1, 'prop_value' => 'robin'),
2 => array('prop_id' => 2, 'prop_value' => 'superman'),
4 => array('prop_id' => 4, 'prop_value' => 'catwoman'),
),
);
这是可行的,但我的代码看起来又脏又脏。如我所见,任何比我的更好的解决方案都是,您希望保留第二个数组元素,以防第一个数组和第二个数组的键匹配 PHP手册中说: 如果要将第二个数组中的数组元素追加到第一个数组中,同时不覆盖第一个数组中的元素,也不重新编制索引,请使用+数组联合运算符:
<?php
$array1 = array(0 => 'zero_a', 2 => 'two_a', 3 => 'three_a');
$array2 = array(1 => 'one_b', 3 => 'three_b', 4 => 'four_b');
$result = $array1 + $array2;
var_dump($result);
?>
有关更多详细信息,请查看,正如我所看到的,您希望保留第二个数组元素,以防第一个数组和第二个数组的键匹配 PHP手册中说: 如果要将第二个数组中的数组元素追加到第一个数组中,同时不覆盖第一个数组中的元素,也不重新编制索引,请使用+数组联合运算符:
<?php
$array1 = array(0 => 'zero_a', 2 => 'two_a', 3 => 'three_a');
$array2 = array(1 => 'one_b', 3 => 'three_b', 4 => 'four_b');
$result = $array1 + $array2;
var_dump($result);
?>
有关更多详细信息,请查看以下功能,该功能将按照您的描述工作:
function array_merge_overwrite($arr1, $arr2, $uniques=array('prop_id'), $delimiter='-')
{
$result = array();
$uk = array();
foreach($arr1 as $a1)
{
$uk = array();
foreach($uniques as $u) $uk[] = $a1[$u];
$result[implode($delimiter, $uk)] = $a1;
}
foreach($arr2 as $a2)
{
$uk = array();
foreach($uniques as $u) $uk[] = $a2[$u];
$result[implode($delimiter, $uk)] = $a2;
}
return $result;
}
如果按照问题中的定义传递了$arr1
和$arr2
,则上述函数将返回一个数组:
Array
(
[1] => Array
(
[prop_id] => 1
[prop_value] => robin
)
[2] => Array
(
[prop_id] => 2
[prop_value] => superman
)
[5] => Array
(
[prop_id] => 5
[prop_value] => wonderwoman
)
[4] => Array
(
[prop_id] => 4
[prop_value] => catwoman
)
)
当然,如果始终且仅使用prop\u id
作为唯一元素,那么函数可能会简单一些:
function array_merge_overwrite($arr1, $arr2)
{
$tmp = array();
foreach($arr1 as $a1) $tmp[$a1['prop_id']] = $a1['prop_value'];
foreach($arr2 as $a2) $tmp[$a2['prop_id']] = $a2['prop_value'];
$result = array();
foreach($tmp as $k=>$v) $result[] = array('prop_id'=>$k, 'prop_value'=>$v);
return $result;
}
在后面的函数中,返回数组的唯一区别在于元素数组的键将是标准数值,而不是与
属性id
s匹配。下面是一个按您所述工作的函数:
function array_merge_overwrite($arr1, $arr2, $uniques=array('prop_id'), $delimiter='-')
{
$result = array();
$uk = array();
foreach($arr1 as $a1)
{
$uk = array();
foreach($uniques as $u) $uk[] = $a1[$u];
$result[implode($delimiter, $uk)] = $a1;
}
foreach($arr2 as $a2)
{
$uk = array();
foreach($uniques as $u) $uk[] = $a2[$u];
$result[implode($delimiter, $uk)] = $a2;
}
return $result;
}
如果按照问题中的定义传递了$arr1
和$arr2
,则上述函数将返回一个数组:
Array
(
[1] => Array
(
[prop_id] => 1
[prop_value] => robin
)
[2] => Array
(
[prop_id] => 2
[prop_value] => superman
)
[5] => Array
(
[prop_id] => 5
[prop_value] => wonderwoman
)
[4] => Array
(
[prop_id] => 4
[prop_value] => catwoman
)
)
当然,如果始终且仅使用prop\u id
作为唯一元素,那么函数可能会简单一些:
function array_merge_overwrite($arr1, $arr2)
{
$tmp = array();
foreach($arr1 as $a1) $tmp[$a1['prop_id']] = $a1['prop_value'];
foreach($arr2 as $a2) $tmp[$a2['prop_id']] = $a2['prop_value'];
$result = array();
foreach($tmp as $k=>$v) $result[] = array('prop_id'=>$k, 'prop_value'=>$v);
return $result;
}
在后面的函数中,返回数组的唯一区别在于元素数组的键将是标准数值,而不是匹配prop\u id
s