合并数组而不重新索引键


merge arrays without reindexing keys

我有两个数组要递归合并,所以添加数组不是一个选项。这是一个没有多级来证明问题的简单例子:

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