0

我有两个要递归合并的数组,因此添加数组不是一种选择。这是一个没有多级的简单示例来演示问题:

$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"
));
4

5 回答 5

3

你可以$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
        )

)

这是你想要达到的目标吗?

于 2013-09-01T11:33:54.310 回答
2

这应该适用于您的特定问题:

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));
于 2013-09-02T07:41:45.623 回答
1

您可以随时尝试手动案例。

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;

当然,它很慢,但它会起作用。

于 2013-09-01T11:33:54.073 回答
1
$a1 = array(
    5 => 'pronoun'
);
$a2 = array(
    2 => 'verb',
    3 => 'noun'
);
foreach($a2 as $key=>$value) {
    $a1[$key] = $value;
}
print_r($a1);
于 2013-09-01T11:40:14.310 回答
1
<?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);

于 2013-09-01T12:21:25.150 回答