PHP中array_merge与数组相加的区别分析

Ruby
Ruby
发布时间:2026-10-14 | 3人浏览过
原创

在PHP开发中,处理数据集合时经常面临合并数组的需求。开发者最常混淆的是 array_merge() 函数与使用加号 + 运算符进行数组相加的行为。两者的核心区别在于对重复键名的处理策略不同:前者倾向于后续覆盖或重置索引,后者则严格保留最先出现的值。理解这些差异对于保证数据完整性至关重要。

字符串键名场景下的行为差异

当数组中的键名为字符串时,两种操作表现出截然不同的合并逻辑:

  1. array_merge()(覆盖策略):如果两个数组拥有相同的字符串键名,后一个数组的值将直接覆盖前一个数组的值。
  2. 数组相加 +(首存策略):如果两个数组拥有相同的字符串键名,结果数组将只包含第一个数组中该键对应的值,完全忽略后续数组中的同名键。

通过以下代码可以直观验证这一现象:

<?php
$arr1 = array('a' => 'PHP');
$arr2 = array('a' => 'JAVA');

// array_merge:后面的覆盖了前面的
print_r(array_merge($arr1, $arr2)); // Array ( [a] => JAVA )

// 数组相加:保留了先出现的值
print_r($arr1 + $arr2); // Array ( [a] => PHP )
?>

数字键名场景下的行为差异

当数组键名为整数(数字)时,差异主要体现在索引的处理上:

  1. array_merge()(重新索引):它不会根据键名判断是否“相同”而舍弃,而是将所有元素追加在一起,并对数字索引重新从0开始排序编号。这意味着即使内容重复,只要索引位置不同,就会被保留。
  2. 数组相加 +(去重丢弃):对于数字键名,它依然遵循“优先匹配”原则。一旦前一个数组已经占用了某个索引(如0),后一个数组中具有相同索引的元素将被直接抛弃,不会触发重新索引。

示例代码如下:

<?php
$arr1 = array("C", "PHP");
$arr2 = array("JAVA", "PHP");

// array_merge:追加并重置索引,保留所有值
print_r(array_merge($arr1, $arr2)); 
// Array ( [0] => C [1] => PHP [2] => JAVA [3] => PHP )

// 数组相加:后面的键名[0,1]已被占用,值被抛弃
print_r($arr1 + $arr2); 
// Array ( [0] => C [1] => PHP )
?>

如何获取相同键名下所有值的集合

如果在实际业务中,面对字符键名相同且值不同的多个数组,开发者希望保留所有相关的值而不是简单地进行覆盖或丢弃,可以使用递归合并函数 array_merge_recursive()。

该函数的特殊之处在于:当遇到相同的字符串键名时,它不会覆盖也不会丢弃,而是将这些值合并到一个新的子数组中;而数字键名则会按常规方式追加。

具体实现如下:

<?php
$arr1 = array("a" => "php", "c");
$arr2 = array("a" => "java", "c", "ruby");

print_r(array_merge_recursive($arr1, $arr2));
?>

执行后的输出结果为:

Array
(
    [a] => Array
        (
            [0] => php
            [1] => java
        )
    [0] => c
    [1] => c
    [2] => ruby
)

通过这种结构化的处理方式,你可以有效地提取多个数组中相同键名下的所有元素值集合,满足复杂的数据处理需求。

以上就是PHP中array_merge和数组相加的详细区别分析,更多关于PHP数组合并技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表