合并两个多维数组并重新索引所有子数组。

10
我可以帮您翻译成中文。这段内容是关于编程的,需要将两个数组合并成一个数组。以下是详细信息:

第一个数组:

Array
(
    [0] => Array
        (
            [a] => 1
            [b] => 2
            [c] => 3
        )

    [1] => Array
        (
            [a] => 3
            [b] => 2
            [c] => 1
        )
)

第二个数组:

Array
(
    [0] => Array
        (
            [d] => 4
            [e] => 5
            [f] => 6
        )

    [1] => Array
        (
            [d] => 6
            [e] => 5
            [f] => 4
        )
)

我希望能够得到这个结果。有人知道如何做到吗?
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [1] => Array
        (
            [0] => 3
            [1] => 2
            [2] => 1
        )
    [2] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 6
        )

    [3] => Array
        (
            [0] => 6
            [1] => 5
            [2] => 4
        )
)

希望您能理解这个问题。非常感谢。

4
使用array_merge有什么问题吗? - Jonnix
@JonStirling 如果您想要的结果可以保留原始数组的键,则可以这样做。请注意,他的回答对子数组使用从0开始的索引。是否这是他需要的结果,只有他能回答! - liquorvicar
我认为array_merge没有问题。看起来像OP:http://codepad.org/Bf5VpZOr - PiTheNumber
array_merge函数不能给我想要的结果。我想要子数组的基于0的索引,就像liquorvicar所说的那样。 - Rajesh Shrestha
5个回答

13

试试使用array_merge函数:

$result = array_merge($array1, $array2);

这个答案不正确,因为它未能产生所需的结果。证明:https://3v4l.org/FodoK - mickmackusa

3

已修复(再次修复)

function array_merge_to_indexed () {
    $result = array();

    foreach (func_get_args() as $arg) {
        foreach ($arg as $innerArr) {
            $result[] = array_values($innerArr);
        }
    }

    return $result;
}

该函数接受无限数量的输入数组,将所有子数组合并为一个容器作为索引数组,并返回结果。

编辑于03/2014:提高可读性和效率。


1
这将保留数组中的原始键,这不是他正在寻找的结果(至少不是从问题中的数据来看)。 - liquorvicar
1
@liquorvicar 不,函数的目的就是为了避免这种情况,否则我就会直接说“使用array_merge()”了。我使用[]来转换为索引,虽然你的不带最后一个循环的array_values()方法可能更好。 - DaveRandom
1
啊,好的,我运行了你的代码,但是它对我来说没有起作用,但是看了你编辑后的帖子,我想我运行的可能是旧版本。 - liquorvicar
1
是的,我发布了两个稍微错误的版本,但我意识到它们是错误的并进行了修正 :-) - DaveRandom

2

更简单和现代的方法是:

$merged = $array1 + ['apple' => 10, 'orange' => 20] + ['cherry' => 12, 'grape' => 32];

PHP 5.4引入了新的数组语法。


数组并集运算符不适用于这个特定问题。您的代码片段只会破坏数据。失败的证明:https://3v4l.org/XWNmj - mickmackusa

1
如果你想返回你在问题中指定的确切结果,那么可以使用类似以下的代码:
function array_merge_no_keys() {
    $result = array();
    $arrays = func_get_args();
    foreach( $arrays as $array ) {
        if( is_array( $array ) ) {
            foreach( $array as $subArray ) {
                $result[] = array_values( $subArray );
            }
        }
    }
    return $result;
}

所以...这只是已接受答案的副本,还额外进行了不必要的is_array()检查? - mickmackusa
@mickmackusa 这不是“抄袭”。这个答案最初是与现在被接受的答案同时发布的(当时是错误的,后来已经进行了编辑)。是否需要额外的 is_array() 检查实际上取决于情况。如果没有它,代码将在任何输入为标量值而不是数组时出错。如果您可以保证输入始终为数组,则是不必要的。根据情况,您可能会将其转换为数组而不是使用 is_array 进行检查(并且在第二级值上也执行相同操作)。 - liquorvicar

0
作为一个纯本地函数解决方案,合并数组,然后重新索引每个子数组。
代码:(演示)
$a = [
    ['a' => 1, 'b' => 2, 'c' => 3],
    ['a' => 3, 'b' => 2, 'c' => 1],
];
$b = [
    ['d' => 4, 'e' => 5, 'f' => 6],
    ['d' => 6, 'e' => 5, 'f' => 4],
];

var_export(
    array_map('array_values' array_merge($a, $b))
);

输出:

array (
  0 => 
  array (
    0 => 1,
    1 => 2,
    2 => 3,
  ),
  1 => 
  array (
    0 => 3,
    1 => 2,
    2 => 1,
  ),
  2 => 
  array (
    0 => 4,
    1 => 5,
    2 => 6,
  ),
  3 => 
  array (
    0 => 6,
    1 => 5,
    2 => 4,
  ),
)

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