PHP合并数组的几种方法比较

概述

php合并数组一般有三个方法

  1. 使用array_merge函数
  2. 使用array_merge_recursive函数
  3. 使用操作符+

对比差异

array_merge+的比较

  1. 对于字符串索引,array_merge以后面的数组为准,覆盖前面数组相应的值;+操作以前面的数组为准
  2. 对于数字索引,array_merge会同时保留所有数组的对应的值,并且把索引从0重排;+操作处理数字索引的策略和处理字符串索引一致:以前面的数组为准,且保留原索引

array_mergearray_merge_recursive的比较

  1. 对于相同的字符串索引,array_merge_recursive会把所有的值合并成一个数组,而array_merge会以后面的数组为准
  2. 对于数字索引,两者都会保留全部的值,并把索引从0重排

注意

  • array_merge只传入一个数组参数时,会把参数中的数组索引从0重排
  • array_merge_recursive对于相同的字符串索引,如果值仍是数组,则会对数组再次合并当做此索引的值

代码示例

$arr1 = [
    2 => 'super',
    1 => 'star',
    'hello' => 'my world',
    'arr' => [
        3 => 'ha',
        2 => 'ya',
        'hello' => 'wa',
    ]
];
$arr2 = [
    1 => 'lets',
    2 => 'laugh',
    'hello' => 'your world',
    'arr' => [
        'yes no'
    ]
];

print_r(array_merge($arr1, $arr2));

print_r($arr1 + $arr2);

print_r(array_merge_recursive($arr1, $arr2));

以上代码输出为:

Array
(
    [0] => super
    [1] => star
    [hello] => your world
    [arr] => Array
        (
            [0] => yes no
        )

    [2] => lets
    [3] => laugh
)
Array
(
    [2] => super
    [1] => star
    [hello] => my world
    [arr] => Array
        (
            [3] => ha
            [2] => ya
            [hello] => wa
        )

)
Array
(
    [0] => super
    [1] => star
    [hello] => Array
        (
            [0] => my world
            [1] => your world
        )

    [arr] => Array
        (
            [3] => ha
            [2] => ya
            [hello] => wa
            [3] => yes no
        )

    [2] => lets
    [3] => laugh
)

Bug

在7.0.20版本中,array_merge_recursive合并相同字符串索引的数组时,合并结果中会有相同的数字索引。

$arr1 = [
    'arr' => [
        3 => 'hello',
        2 => 'world',
    ]
];
$arr2 = [
    'arr' => [
        'yes',
        'no'
    ]
];

$result = array_merge_recursive($arr1, $arr2);

print_r($result);

以上代码会输出:

Array
(
    [arr] => Array
        (
            [3] => hello
            [2] => world
            [2] => yes
            [3] => no
        )

)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区

领取腾讯云代金券