资讯专栏INFORMATION COLUMN

PHP 的 array_merge 详解

darcrand / 2360人阅读

摘要:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。语法很简单,返回值是合并后的数组并不总是你所期望的返回值。如下会产生一条,并且的返回值会是。要注意的是参数为怎么处理。

导语

array_merge 这个函数很实用,也很常用,但是它有一些特性,不注意的话就会造成麻烦。前几天修改同事代码的时候,就出现了这种问题,所以查些资料写下来。

定义与语法
array array_merge ( array $array1 [, array $... ] ) 
合并一个或多个数组。
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

语法很简单,返回值是合并后的数组(并不总是你所期望的返回值)。

实例
 "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 "
"; print_r(array_merge($arr1, $arr2, $arr3));// 索引数组和关联数组合并 Array ( [0] => apple [1] => banana [2] => pear [3] => orange [pitaya] => 火龙果 ) echo "
"; // 索引数组不会覆盖,但是使用 + 的话,前面的值会覆盖后面相同索引的值 print_r($arr1 + $arr2);// Array ( [0] => apple [1] => banana [2] => orange ) echo "
"; // 关联数组 $arr1 = array("apple" => "苹果", "banana" => "香蕉"); $arr2 = array("apple" => "黄元帅苹果", "orange" => "橙子"); print_r(array_merge($arr1, $arr2));// Array ( [apple] => 黄元帅苹果 [banana] => 香蕉 [orange] => 橙子 ) echo "
"; // 后面的值会覆盖前面相同key的值,而使用 + 则正好相反,前面的值会覆盖后面的值 print_r($arr1 + $arr2);// Array ( [apple] => 苹果 [banana] => 香蕉 [orange] => 橙子 )
填坑

那么 array_merge 所谓的坑是什么呢?
实际使用中,使用框架从数据库中查询数据,返回的是二维数组或者一维数组。但是如果查询不到数据,返回的是 null ,这个时候使用 array_merge 的话,就会产生错误了。如下


会产生一条 Warning,并且 array_merge 的返回值会是 null
处理方法不难,只要将参数转换为数组即可,可以封装函数进行处理。要注意的是参数为 false 怎么处理。如下

 $value) {
        $newArray = array_merge($newArray, $value);
    }

    return $newArray;
}

$arr1 = array("test" => array("apple", "pear"), "test1" => array("apple", "pear"));
$arr2 = false;
$arr3 = null;

print_r((array)$arr2);// Array ( [0] => )
echo "
"; print_r((array)$arr3);// Array ( ) echo "
"; print_r(array_merge_perfect($arr1, $arr2));// Array ( [test] => Array ( [0] => apple [1] => pear ) [test1] => Array ( [0] => apple [1] => pear ) ) echo "
"; print_r(array_merge_perfect($arr1, $arr3));// Array ( [test] => Array ( [0] => apple [1] => pear ) [test1] => Array ( [0] => apple [1] => pear ) ) echo "
"; print_r(array_merge_perfect($arr2, $arr3));// Array ( ) echo "
";

参考资料:array_merge、数组转换、可变参数。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29970.html

相关文章

  • PHParray_merge函数与array+array区别

    在PHP中可以使用array_merge函数和两个数组相加array+array的方式进行数组合并,但两者效果并不相同,下面为大家介绍两者具体的使用区别. 区别如下: 1. 当下标为数值时,array_merge()不会覆盖掉原来的值,但array+array合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值抛弃掉(不是覆盖). 2. 当下标为字符时,array+ar...

    amuqiao 评论0 收藏0
  • 10个值得深思PHP面试问题

    摘要:运算符的优先级,是明显高于,因此先执行再执行。这里会非常有趣的将转换成一个数字而且默认去掉了前面的也就是很显然上面的问题已经说过了数字和字符串类型不一致。 showImg(https://segmentfault.com/img/bVvhhO); 本文翻译自:https://www.toptal.com/php/interview-questions ,文章所罗列的问题虽然看似简单,但...

    BetaRabbit 评论0 收藏0
  • 有关array_keys,array_merge一次报错

    摘要:类型不同导致的问题结果如下我们发现当为数字的时候,是不会进行去重的导致的类型转换结果我们发现通过之后都变成了类型 array_merge 类型不同导致的问题 $a = [1=>php,2=>mysql,3=>redis]; $c = [1=>zabbix,2=>mysql]; $d = array_merge($a,$c); var_dump($d); 结果如下 array(5) {...

    huashiou 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<