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

Posted

技术标签:

【中文标题】合并两个多维数组并重新索引所有子数组【英文标题】:Merge two multidimensional arrays and reindex all subarrays 【发布时间】:2012-01-23 14:55:42 【问题描述】:

我有两个数组,我想将这两个数组合并成一个数组。请查看以下详细信息:

第一个数组:

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

希望您已经理解了这个问题。 提前谢谢你。

【问题讨论】:

使用array_merge有什么问题吗? @JonStirling 是的,如果您想要 OP 指定的结果,那么它将保留原始数组的键。请注意,他的答案对他的子数组有基于 0 的索引。不管是不是他需要的结果,只有他能回答! 我没有看到 array_merge 的问题。看起来像 OP:codepad.org/Bf5VpZOr array_merge 函数不会给我想要的结果。正如liquevicar 所说,我想要子数组的基于0的索引。 【参考方案1】:

作为纯原生函数解决方案,合并数组,然后重新索引每个子数组。

代码:(Demo)

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

【讨论】:

【参考方案2】:

已修复(再次)

function array_merge_to_indexed () 
    $result = array();

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

    return $result;

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

EDIT 03/2014:提高了可读性和效率

【讨论】:

这会保留数组中的原始键,这不是他正在寻找的结果(至少不是来自问题中的数据)。 @liquorvicar 不,这不是函数的重点,否则我只会说“使用 array_merge()”。我使用[] 转换为索引,尽管没有最后一个循环方法的array_values() 可以说更好。 啊,好吧,我确实运行了你的代码,但它对我不起作用,但看看你编辑的帖子,它一定是我运行的旧版本。 是的,我发布了两个稍微错误的版本,但我意识到它们是错误的并修复了它们:-)【参考方案3】:

更简单现代的方式是:

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

php 5.4 中的新数组语法

【讨论】:

数组联合运算符不适合这个特定的问题。您的 sn-p 只会损坏数据。失败证明:3v4l.org/XWNmj【参考方案4】:

如果您想返回您在问题中指定的确切结果,那么类似的方法将起作用

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;

【讨论】:

Sooo...这只是接受的答案的副本,并附加了不必要的is_array()? @mickmackusa 这不是“副本”。该答案最初与现在接受的答案同时发布(当时是错误的,此后已被编辑)。是否需要额外的is_array() 检查确实取决于具体情况。如果没有 out,如果任何输入是标量值而不是数组,则代码将出错。如果您可以保证输入始终是数组,那么是的,这是不必要的。根据情况,您可能会强制转换为数组,而不是使用 is_array 进行检查(并对二级值执行相同的操作)。【参考方案5】:

试试array_merge:

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

【讨论】:

此答案不正确,因为 ot 无法产生所需的结果。证明:3v4l.org/FodoK

以上是关于合并两个多维数组并重新索引所有子数组的主要内容,如果未能解决你的问题,请参考以下文章

将多维数组添加到其他多维数组的子数组中

Matlab的多维数组操作

如何在php中通过键值合并两个多维数组?

检查多维数组的任何子数组中的特定键是不是存在特定值

php计算多维数组某个值的和

jQuery循环遍历多维数组并显示每个父数组的子数组