坑人的 PHP 系列: 合并两个数组的 array_merge() 和 + 完全是两种行为

yufei       4 天, 11 小时 前       25

把两个数组合并成一个数组,也就是求两个数组的 并集 功能,有多少个函数呢?

<?php
+  // +  运算符加号也可以合并两个数组

array_merge(array $... = ?): array  // 合并一个或多个数组

array_merge_recursive(array $... = ?): array  // 递归地合并一个或多个数组

array_merge_recursive() 函数是递归合并,我们稍后介绍,现在先来看看 + 号和 array_merge() 的区别

如果仅仅是看官方的简短说明,我们可能会认为 + 号其实是 array_merge() 的别名,但实际上呢,并不是,差别还是蛮大的。

我们先来写比较函数,比如我们让 array_merge+ 都接受两个数组 $first$second 两个数组,然后比较输出的结果

<?php

print_r(array_merge($first,$second));

// vs. 

print_r($first + $second);

第一次,我们的 $first$second 都是标准的,键以 0 开始的数组

<?php

$first = [
    'a',
    'b',
];

$second = [
    'c',
];

输出结果是什么呢?

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

当两个数组参数 $first$second 都是数字索引数组时, array_merge() 简单的把第二个数组的元素追加到第一个数组末尾。 而 + 则直接把相同的数字键忽略了。

上面的实验有点不太严谨,我们把两个参数对掉下看看

print_r(array_merge($second,$first));

// vs. 

print_r($second + $first);

输出结果如下

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

array_merge() 仍旧是原样的追加,但 + 号确实会把相同的数字键的值忽略,而没有的键则会把值简单的追加到第一个数组的后面。

因此,我们得出第一个结论 如果所有参数仅存在以 0 开始的数字索引,那么第二个参数开始的所有数组元素, array_merge() 会以追加的方式,而 + 号则会对第一个数组中存在的键的值直接忽略的操作

那么你也许会问,如果所有的数组中既存在数字键又存在字符串键会怎么样呢?

我们试一试吧

<?php 

$first = array("color" => "red", 2, 4);

$second = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);

print_r(array_merge($first,$second));

// vs. 

print_r($first + $second);

运行结果如下

Array
(
    [color] => green
    [0] => 2
    [1] => 4
    [2] => a
    [3] => b
    [shape] => trapezoid
    [4] => 4
)
Array
(
    [color] => red
    [0] => 2
    [1] => 4
    [shape] => trapezoid
    [2] => 4
)

从结果中可以看到 当所有的参数既存在数字键又存在字符串键时,array_merge() 的行为是:字符串键直接替换,而数字键则采用追加的方式;+ 号则对已经存在的字符串键则忽略,对于存在的数字键也忽略,而不存在的则采用追加的方式

我们来看一个比较极端的例子

<?php 
$first = array();
$second = array(1 => "data");

print_r(array_merge($first,$second));

// vs. 

print_r($first + $second);

输出结果是什么呢?

Array
(
    [0] => data
)
Array
(
    [1] => data
)

是不是符合我们上述的假设?? array_merge() 采用的是 追加 方式,而 + 号则采用替换方式。

因此,我们可以得出一个结论,就是什么使用用 + 号:

如果想完全保留原有数组并只想新的数组附加到后面则使用 + 号,否则使用 array_merge()

也就是说 + 做了如下操作 第一个数组的键名将会被保留。在两个数组中存在相同的键名时,第一个数组中的同键名的元素将会被保留,第二个数组中的元素将会被忽略

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2018 简单教程 twle.cn All Rights Reserved.