php 数组 merge,PHP 的 array_merge 详解

本文详细介绍了PHP中的array_merge函数,包括其工作原理和注意事项。当合并索引数组和关联数组时,array_merge如何处理重复键值。还展示了如何处理可能遇到的错误,如当合并的数组中包含null或false时,如何避免警告并正确合并数组。最后提供了一个完善的array_merge函数封装示例,确保在各种情况下都能正确合并数组。
摘要由CSDN通过智能技术生成

导语

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

定义与语法

array array_merge ( array $array1 [, array $... ] )

合并一个或多个数组。

如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

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

实例

// 索引数组

$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 '
';

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 的话,就会产生错误了。如下

$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 怎么处理。如下

/**

* 完善 array_merge

* 将所有参数转换为数组,null、false 转换为空数组

* @param array ...$args

* @return array

*/

function array_merge_perfect(...$args)

{

$fun = function ($value) {

if ($value === false) {

return array();

}

return (array)$value;

};

// 将所有参数都转换为 array 类型

$arr = array_map($fun, $args);

$newArray = array();

foreach ($arr as $key => $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 '
';

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值