我在PHP中有2个数组,一个模拟可以编辑的属性,另一个模拟属性和它应该具有的值。
示例如下:
$arr1 = array(
'entity1' => array(
'property1' => null,
'property2' => null,
),
'entity2' => array(
'property3' => null,
'property4' => null,
'property5' => null,
)
);
$arr2 = array(
'entity1' => array(
'property1' => 1,
'property2' => 0,
),
'entity2' => array(
'property3' => 0,
'property4' => 1,
)
);
现在我需要合并这些数组并保留空值,以便输出如下:
$output = array(
'entity1' => array(
'property1' => 1,
'property2' => 0,
),
'entity2' => array(
'property3' => 0,
'property4' => 1,
'property5' => null,
)
);
我尝试了array_merge()
和$arr1 + $arr2
,两者都输出了这个:
Array
(
[entity1] => Array
(
[property1] => 1
[property2] => 0
)
[entity2] => Array
(
[property3] => 0
[property4] => 1
)
)
数组可能比示例中显示的更深,因此它必须是递归的,并且数组都是关联的。
我已经阅读了很多有关StackOverflow和Googled的问题,但我找到的答案不是递归的,或者只是不适用于这个问题。
编辑
正如上面解释为什么我问这个问题,即使我用答案检查了其他问题显然还不够证明,我尝试了标记的重复问题答案,其中包括:
$merged = array_merge(array_filter($arr1, 'strval'), array_filter($arr2, 'strval'));
它给数组字符串转换错误,因为它不是递归的,这就是我解释的。
答案 0 :(得分:2)
这个递归函数可能是一个起点:
function merge_associative($arr1, $arr2) {
$merged = $arr1;
foreach ($arr2 as $k => $v) {
if (is_array($v) && is_array($arr1[$k]))
$merged[$k] = merge_associative($arr1[$k], $v);
else
$merged[$k] = $v;
}
return $merged;
}
它将合并关联数组,但无法正确处理数字索引。
答案 1 :(得分:0)
function array_join() {
$args = func_get_args();
if (count($args) == 1 && isset($args[0], $args[1])) {
foreach ($args[0] as $value) {
$param[] = $value;
}
}else{
$param = $args;
}
$array = merge_associative($param[0], $param[1]);
unset($param[0]);
unset($param[1]);
if (isset($param[2])) $array = array_join($array, $param[2]);
return $array;
}