把两个数组合并成一个数组,也就是求两个数组的 并集 功能,有多少个函数呢?
<?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()
也就是说 +
做了如下操作 第一个数组的键名将会被保留。在两个数组中存在相同的键名时,第一个数组中的同键名的元素将会被保留,第二个数组中的元素将会被忽略