导语
array_merge
这个函数很实用,也很常用,但是它有一些特性,不注意的话就会造成麻烦。前几天修改同事代码的时候,就出现了这种问题,所以查些资料写下来。
定义与语法
array array_merge ( array $array1 [, array $... ] )
合并一个或多个数组。
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
语法很简单,返回值是合并后的数组(并不总是你所期望的返回值)。
实例
<?php// 索引数组$arr1 = array(0 => 'apple', 1 => 'banana'); $arr2 = array(1 => 'pear', 2 => 'orange'); $arr3 = array('pitaya' => '火龙果'); print_r(array_merge($arr1, $arr2));// array_merge会重建索引 Array ( [0] => apple [1] => banana [2] => pear [3] => orange )echo '<br />'; print_r(array_merge($arr1, $arr2, $arr3));// 索引数组和关联数组合并 Array ( [0] => apple [1] => banana [2] => pear [3] => orange [pitaya] => 火龙果 )echo '<br />';// 索引数组不会覆盖,但是使用 + 的话,前面的值会覆盖后面相同索引的值print_r($arr1 + $arr2);// Array ( [0] => apple [1] => banana [2] => orange )echo '<br />';// 关联数组$arr1 = array('apple' => '苹果', 'banana' => '香蕉'); $arr2 = array('apple' => '黄元帅苹果', 'orange' => '橙子'); print_r(array_merge($arr1, $arr2));// Array ( [apple] => 黄元帅苹果 [banana] => 香蕉 [orange] => 橙子 )echo '<br />';// 后面的值会覆盖前面相同key的值,而使用 + 则正好相反,前面的值会覆盖后面的值print_r($arr1 + $arr2);// Array ( [apple] => 苹果 [banana] => 香蕉 [orange] => 橙子 )
填坑
那么 array_merge
所谓的坑是什么呢?
实际使用中,使用框架从数据库中查询数据,返回的是二维数组或者一维数组。但是如果查询不到数据,返回的是 null
,这个时候使用 array_merge
的话,就会产生错误了。如下
<?php$arr1 = array('apple', 'pear'); $arr2 = null; $arr3 = array_merge($arr1, $arr2); var_dump($arr3);// Warning: array_merge(): Argument #2 is not an array in D:\WWW\test.php on line 6// NULL
会产生一条 Warning
,并且 array_merge
的返回值会是 null
。
处理方法不难,只要将参数转换为数组即可,可以封装函数进行处理。要注意的是参数为 false
怎么处理。如下
<?php/** * 完善 array_merge * @param $arr1 * @param $arr2 * @return array */function array_merge_perfect($arr1, $arr2){ if ($arr1 === false && $arr2 === false) { return array(); } elseif ($arr1 === false) { return (array)$arr2; } elseif ($arr2 === false) { return (array)$arr1; } return array_merge((array)$arr1, (array)$arr2); } $arr1 = array('test' => array('apple', 'pear'), 'test1' => array('apple', 'pear')); $arr2 = false; $arr3 = null; print_r((array)$arr2);// Array ( [0] => )echo '<br />'; print_r((array)$arr3);// Array ( )echo '<br />'; print_r(array_merge_perfect($arr1, $arr2));// Array ( [test] => Array ( [0] => apple [1] => pear ) [test1] => Array ( [0] => apple [1] => pear ) )echo '<br />'; print_r(array_merge_perfect($arr1, $arr3));// Array ( [test] => Array ( [0] => apple [1] => pear ) [test1] => Array ( [0] => apple [1] => pear ) )echo '<br />'; print_r(array_merge_perfect($arr2, $arr3));// Array ( )echo '<br />';
作者:haoyq
链接:https://www.jianshu.com/p/ae4b288175e7