【问题标题】: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的索引。

标签: php arrays multidimensional-array merge reindex


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2014-06-29
    • 2012-03-21
    • 1970-01-01
    • 2017-10-18
    • 2011-11-26
    相关资源
    最近更新 更多