大家都知道合并数组常用的两种方式array_merge 和 +
但是二者是有区别的,用到的时候要小心了,这里是有坑的,比如下面的代码
$a = ['zhangsan', 'lisi'];
$b = ['wangwu', 'zhaoliu'];
$r1 = $a + $b;
$r2 = array_merge($a, $b);
var_dump($r1);
var_dump($r2);
输出结果
# $r1
array (size=2)
0 => string 'zhangsan' (length=8)
1 => string 'lisi' (length=4)
# $r2
array (size=4)
0 => string 'zhangsan' (length=8)
1 => string 'lisi' (length=4)
2 => string 'wangwu' (length=6)
3 => string 'zhaoliu' (length=7)
为了检验二者的区别,在看下面的代码。
$a = ['name' => 'zhangsan', 'age' => 24];
$b = ['name' => 'lisi', 'sex' => 'male', 'city' => 'shanghai'];
$r1 = $a + $b;
$r2 = array_merge($a, $b);
var_dump($r1);
var_dump($r2);
输出结果
# $r1
array (size=4)
'name' => string 'zhangsan' (length=8)
'age' => int 24
'sex' => string 'male' (length=4)
'city' => string 'shanghai' (length=8)
# $r2
array (size=4)
'name' => string 'lisi' (length=4)
'age' => int 24
'sex' => string 'male' (length=4)
'city' => string 'shanghai' (length=8)
看到这是不是明白了一点
在数组为索引数组(即键值为数字)时,用 + 合并数组时,+ 前的数组会把 + 后的数组中拥有相同键的值覆盖掉;而array_merge则不会覆盖拥有相同键的值,并且会重新生成新的键。
在数组为关联数组(即键值为字符串)时,用 + 合并数组时,+ 前的数组会把 + 后的数组中拥有相同键的值覆盖掉;而array_merge合并数组时,参数后面的数组会把前面的数组中拥有相同键的值覆盖掉。
为了验证我们的猜想,再看下面的例子。
$a = [0 => 'profile_a', 'name' => 'zhangsan', 'age' => 24, 'city' => 'beijing'];
$b = [0 => 'profile_b', 1 => 'this is zhangsan`s profile', 'sex' => 'male', 'city' => 'shanghai'];
$r1 = $a + $b;
$r2 = array_merge($a, $b);
var_dump($r1);
var_dump($r2);
输出结果
# $r1
array (size=6)
0 => string 'profile_a' (length=9)
'name' => string 'zhangsan' (length=8)
'age' => int 24
'city' => string 'beijing' (length=7)
1 => string 'this is zhangsan`s profile' (length=26)
'sex' => string 'male' (length=4)
# $r2
array (size=7)
0 => string 'profile_a' (length=9)
'name' => string 'zhangsan' (length=8)
'age' => int 24
'city' => string 'shanghai' (length=8)
1 => string 'profile_b' (length=9)
2 => string 'this is zhangsan`s profile' (length=26)
'sex' => string 'male' (length=4)
当数组中的键既有数字又有字符串时,使用 + 合并数组依然是前边的数组覆盖后面数组中拥有想似键的值,array_merge 则会保留合并键为数字的值,覆盖键为字符的值(后面的覆盖前面的) 。
php的数组过于灵活了,带来便利的同时也要注意一些坑。
> 测试环境
> php v 7.0