php合并数组时array_merge和+号的区别

昨天 20:07 字数 1775 阅读 3898

大家都知道合并数组常用的两种方式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

3人点赞>
关注 收藏 改进 举报
5 条评论
排序方式 时间 投票
jiong

可以转载吗 会标注转载和作者的

Up骚年
可以
jiong

特点注册一个账号来感谢你 写的很棒很细致

lisgroup

不错,感谢分享

Up骚年
@lisgroup 多谢支持。
请登录后发表评论
站长 @ 十七度
文章
384
粉丝
23
喜欢
195
收藏
31
排名 : 1
访问 : 144.71万
私信