我有两个数组要递归合并,所以添加数组不是一个选项。这是一个没有多级来证明问题的简单例子:
$a1 = Array(
5 => 'pronoun'
)
$a2 = Array(
2 => 'verb',
3 => 'noun'
)
$r = array_merge_recursive($a1, $a2)
我想要得到结果数组:
Array(
5 => 'pronoun'
2 => 'verb',
3 => 'noun'
)
我的问题是array_merge_recursive
函数重新指定密钥,我得到以下内容:
Array(
0 => 'pronoun'
1 => 'verb',
2 => 'noun'
)
我知道这是因为我所有的键都是数字。所以我试着在添加时让它们变成字符串,但它似乎不能正常工作:
$a1[(string)7] = 'some value';
键-7仍然是数字,或者至少它在调试器中是这样显示的——$a1[7]
而不是$a1['7']
。有什么建议吗?
编辑:添加数组不是一个选项。请看原因。我有两个多级阵列:
$a1 = array (
1 => array (
1 => "man1",
2 => "man"
),
2 => array (
1 => "run",
2 => "nice"
)
);
$a2 = array(
2 => array (
1 => "to observe",
2 => "to examine visually"),
3 => array(
1 => "look nice",
2 => "appear, seem to be"));
$r = $a1 + $a2;
我期望的是:
$r = Array(
...
2 => array(
1 => array("run", "to observe")
2 => array("nice", "to examine visually")
));
但是,没有添加来自第二个数组的密钥2的选项:
$r = Array(
...
2 => array(
1 => "run",
2 => "nice"
));
您只需使用$a1+$a2
即可获得结果
$a1 = array(
5 => 'pronoun'
);
$a2 = array(
2 => 'verb',
3 => 'noun'
);
print_r($a1+$a2);
对于递归数组
$a1 = array(
5 => 'pronoun'
);
$a2 = array(array('a', 'z'), array(2 => 'p', 'q'));
print_r($a1+$a2);
结果是
Array
(
[5] => pronoun
[0] => Array
(
[0] => a
[1] => z
)
[1] => Array
(
[2] => p
[3] => q
)
)
这就是你想要实现的吗?
这应该适用于您的特定问题:
function assoc_merge(array $a, array $b)
{
$r = array();
foreach ($a as $key => $val) {
if (array_key_exists($key, $b) && is_array($val) == is_array($b[$key])) {
if (is_array($val)) {
$r[$key] = assoc_merge($a[$key], $b[$key]); // merge array
} else {
$r[$key] = array($val, $b[$key]); // merge entry
}
} else {
$r[$key] = $val; // just copy
}
}
return $r + $b; // add whatever we missed
}
print_r(assoc_merge($a1, $a2));
您可以随时尝试手动案例。
function merge () { // takes any number of arguments
$arrays = func_get_args();
$result = array();
foreach ($arrays as $array)
foreach ($array as $key => $item)
if (is_array($item))
$result = merge($result, $item);
else
$result[$key] = $item;
return $result;
当然,它很慢,但它会起作用的。
$a1 = array(
5 => 'pronoun'
);
$a2 = array(
2 => 'verb',
3 => 'noun'
);
foreach($a2 as $key=>$value) {
$a1[$key] = $value;
}
print_r($a1);
<?php
$a = [ 5 => 'pronoun'];
$b = [ 2 => 'verb', 3 => 'noun'];
$m = array_merge(array_keys($a), array_keys($b));
$final = array_combine($m, array_merge_recursive($a, $b));
print_r($final);