我有两个多维数组,如:
[a]
[b]
[c]
和
[a]
[b]
[c]
[d]
并希望将其转换为单个数组
[a]
[b]
[c]
[d]
我尝试了array_merge_recursive()
函数,但它在最后一级创建了新元素,而不是覆盖它们。
例如,如果第一个数组中的[c]
为"X"
,而第二个数组中为"Y"
,则会获得array("X", "Y")
而不是最后一个值({{1} }})。
答案 0 :(得分:10)
使用array_replace_recursive
?
<?php
$arr1 = array ('a' => array ('b' => array ('c' => 'X'), 'd' => 'array_1_d'));
$arr2 = array ('a' => array ('b' => array ('c' => 'Y', 'd' => 'Z')), 'e' => 'array_2_e');
$arr3 = array_replace_recursive ($arr1, $arr2);
var_dump($arr3);
输出:
array(2) {
["a"]=>
array(2) {
["b"]=>
array(2) {
["c"]=>
string(1) "Y"
["d"]=>
string(1) "Z"
}
["d"]=>
string(9) "array_1_d"
}
["e"]=>
string(9) "array_2_e"
}
http://www.php.net/manual/en/function.array-replace-recursive.php
答案 1 :(得分:1)
编辑: Just seeing,存在一个函数:):array_replace_recursive
Docs。如果低于PHP 5.3,这可能仍然有用:
Union of two arrays(带字符串键),递归:
function array_union_recursive(Array $a, Array $b)
{
foreach($a as $k => &$v)
{
if (is_array($v) && isset($b[$k]) && is_array($b[$k]))
{
$v = array_union_recursive($a[$k], $b[$k]);
}
}
$a += $b;
return $a;
}
如果要获取最后一个值而不是第一个值,则需要在调用函数时交换$a
和$b
,但无论如何都需要以某种方式指定规则。这就是array_merge_recursive
保存每个值的原因。
答案 2 :(得分:1)
考虑两个阵列:
<?php
$test1 = array(array('a','b','c'), 'a', 'b');
$test2 = array(array('d','e'), 'c');
?>
使用覆盖合并时,您会希望结果是一个数组:
<?php $test3 = array(array('d','e'), 'c', 'b'); ?>
但是这个数组会产生大部分功能:
所以,这是一个功能:
<?php
function array_merge_overwrite(array &$array1, array $array2 = NULL)
{
$flag = true;
foreach (array_keys($array2) as $key)
{
if (isset($array2[$key]) && is_array($array2[$key]))
{
if (isset($array1[$key]) && is_array($array1[$key]))
array_merge_overwrite($array1[$key], $array2[$key]);
else
$array1[$key] = $array2[$key];
$flag = false;
}
}
if ($flag == true)
$array1 = $array2;
}
?>