我有这段代码
$a1 = array(
'success' => TRUE,
'data' => array(
'foo' =>
array(
21 =>
array(
1 =>
array(1, 2, 3, 4, 5)
)
)
)
);
$a2 = array(
'success' => TRUE,
'data' => array(
'foo' =>
array(
21 =>
array(
7 =>
array(6, 7, 8, 9, 10)
)
)
)
);
$results = array();
$results = array_merge_recursive($results, $a1['data']);
$results = array_merge_recursive($results, $a2['data']);
var_dump($results);
根据我对array_merge_recursive()的理解,我期待结果将是
array
'foo' =>
array
21 =>
array
1 =>
array
0 => int 1
1 => int 2
2 => int 3
3 => int 4
4 => int 5
7 =>
0 => int 6
1 => int 7
2 => int 8
3 => int 9
4 => int 10
相反,我得到了这个
array
'foo' =>
array
21 =>
array
1 =>
array
0 => int 1
1 => int 2
2 => int 3
3 => int 4
4 => int 5
22 =>
array
7 =>
array
0 => int 6
1 => int 7
2 => int 8
3 => int 9
4 => int 10
22
索引来自何处?为什么输出方式不同?我使用的功能错了吗?
答案 0 :(得分:2)
array_merge_recursive
合并来自与第一个数组相同深度的元素/数组,但是如果两个数组的键都是数字索引并且它们是相同的,则它会附加到它。这就是你的情况。从那时起,通过创建索引21
,您的数组将附加在第2级,其中索引22
被找到。要接收所需的输出,您已将索引21
更改为字符串键"x21"
php手册中的注释
如果输入数组具有相同的字符串键,则为其值 这些键合并到一个数组中,这样就完成了 递归地,如果其中一个值是一个数组本身,那么 函数将它与另一个数组中的相应条目合并 太。但是,如果数组具有相同的数字键,则后者 值不会覆盖原始值,但会被追加。
答案 1 :(得分:0)
我刚遇到同一问题,我想合并数组,但令人惊讶的是发现键在结果中自动更改了。原因是因为我的“键”是一串十进制数字,没有任何字母字符。
但幸运的是,我注意到,如果键具有字母字符,则可以保留它们。因此,提出了以下想法,该想法是在合并之前递归地在每个键上添加字母“ S”,然后在最终结果中将其删除。
有关详细信息,请参考enhanced_array_merge_recursive
函数:
<?php
$aa = [
'10' => 'book',
'14' => ['cat'],
];
$ab = [
'12' => 'cd',
'18' => 'cup',
'14' => ['dog'],
];
var_dump(enhanced_array_merge_recursive($aa, $ab));
function revise_keys($source)
{
if (!is_array($source)) {
return $source;
}
$target = [];
foreach ($source as $key => $value) {
$target['S' . $key] = revise_keys($value);
}
return $target;
}
function revert_keys($source)
{
if (!is_array($source)) {
return $source;
}
$target = [];
foreach ($source as $key => $value) {
$target[substr($key, 1 - strlen($key))] = revert_keys($value);
}
return $target;
}
function enhanced_array_merge_recursive(...$candidates)
{
$merged = [];
foreach ($candidates as $candidate) {
if (!is_array($candidate)) {
continue;
}
$merged = array_merge_recursive($merged, revise_keys($candidate));
}
return revert_keys($merged);
}
输出如下:
array(4) {
[10] =>
string(4) "book"
[14] =>
array(1) {
[0] =>
array(2) {
[0] =>
string(3) "cat"
[1] =>
string(3) "dog"
}
}
[12] =>
string(2) "cd"
[18] =>
string(3) "cup"
}