PHP - 意外的array_merge_recursive()输出

3
我有这段代码。
$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
< p>22 的索引从何而来?为什么输出结果不同?我使用函数有误吗?< /p>
2个回答

4
array_merge_recursive函数会合并第一个数组相同深度的元素或数组,但是如果两个数组都有数值索引且值相同时,则会将其追加到现有值后面。这就是您所遇到的情况。因此,您的数组被附加到第二层,其中创建了索引为22的索引,因为它发现了索引21。要获得所需的输出结果,您需要将索引21更改为字符串键,例如"x21"
来自php手册的注意事项:
如果输入数组具有相同的字符串键,则这些键的值将合并到一个数组中,并且这样做是递归的,因此,如果其中一个值本身就是一个数组,则该函数还将与另一个数组中的相应条目合并。但是,如果数组具有相同的数字键,则后面的值将不会覆盖原始值,而是将其追加。

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"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接