PHP 的 array_merge 详解

栏目: PHP · 发布时间: 5年前

内容简介:array array_merge ( array $array1 [, array $... ] )合并一个或多个数组。

导语

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
 * 将所有参数转换为数组,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 '<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 />';

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


以上所述就是小编给大家介绍的《PHP 的 array_merge 详解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

顺势而为--雷军传

顺势而为--雷军传

采文 / 哈尔滨出版社 / 2014-9 / 29.80

主要介绍了雷军上大学开始创业到加入金山再到成为天使投资人一直最后创立小米公司的过程,以及他的“站在风口的猪”等个人名言思想的涉及。一起来看看 《顺势而为--雷军传》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器