PHP涨姿势——记录曾经遇到的一个数组合并的坑

PHP涨姿势——记录曾经遇到的一个数组合并的坑

写在前面的废话

一说到数组合并相比你马上就会想到一个函数 array_merge
对,今天就是说说这个函数造成的一个奇葩BUG

array_merge

合并一个或多个数组
array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。

第一坑

不多废话,直接上代码;

$array1 = ['12093'=>['name'=>'calss_name']];
$array2 = ['12393'=>['name'=>'some thing else']];
$new = array_merge($array1,$array2);
var_dump($new);

/*
array(2) {
  [0]=>
  array(1) {
    ["name"]=>
    string(10) "calss_name"
  }
  [1]=>
  array(1) {
    ["name"]=>
    string(15) "some thing else"
  }
}
*/

看结果没什么不正常,两个数组的确是合到了一起,而且看上去过得很幸福;
但是实际开发中情况是这样的。原始数组的 键值 是一个重要信息,后续的逻辑还要用到这个值;但是合并后原来的值被替换成了索引数组。后边出来的数据总是异常,而且写代码的大神也一直没有发现那里不对……

再看下面的代码

$array1 = ['a12093'=>['name'=>'calss_name']];
$array2 = ['a12393'=>['name'=>'some thing else']];
$new = array_merge($array1,$array2);
var_dump($new);
/*
array(2) {
  ["a12093"]=>
  array(1) {
    ["name"]=>
    string(10) "calss_name"
  }
  ["a12393"]=>
  array(1) {
    ["name"]=>
    string(15) "some thing else"
  }
}
*/

这次好像没有前面的问题了……
仔细看一下文档里的这句话
如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

第二坑

$variable = array(
	['a','b','c','d'],
	//null
);

$box = array('A','B',"C");
foreach ($variable as $key => $value) {
	$box = array_merge($box,$value);
}
var_dump($box);

/*
array(7) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
  [3]=>
  string(1) "a"
  [4]=>
  string(1) "b"
  [5]=>
  string(1) "c"
  [6]=>
  string(1) "d"
}
*/

这种情况下似乎一切正常;但是 突然有一天 $variable 中出现了一个 NULL;结果就搞笑了…… 代码就不展示了,感兴趣可以试一下去掉 NULL前面的注释运行一下。

在使用array_merge合并两个数组是还要特别注意判断被合并的变了是不是在任何情况下都是数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Devin_S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值