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合并两个数组是还要特别注意判断被合并的变了是不是在任何情况下都是数组