PHP数组合并对比

Posted by

经常用到数组合并,array_merge,对于不同的场景,使用的函数不同,有时容易混淆,这里做一下记录。

在实际的过程中,我们经常面临的场景是,需不需要对第一个参数的已经存在的值进行覆盖,还是只是追加新的参数。

在下面的场景中,均不考虑非数字索引,即键全部都是字符串格式

假设现有数据

$user = [
    'type' => 'human',
    'age' => '',
    'sex' => '',
];

$tom = [
    'age' => 13,
    'sex' => 'male',
    'name' => 'tom',
];

我期望得到

[
    'type' => 'human',
    'age' => '',
    'sex' => '',
    'name' => 'tom',
]

那如果直接使用array_merge($user, $tom)或者array_replace($user, $tom),均不能实现。

array_merge(a, b),将b合并至a;array_replace(a,b),将b中的元素替代至a。array_replace与array_merge在没有数字索引的情况下,两者是等效的。如果a、b中同时存在的,则使用b的,a没有的,则使用b的

在array_merge的文档说明中,有这样一段备注描述:如果你想完全保留原有数组并只想新的数组附加到后面,用 + 运算符。因而原来的方式为 $user + $tom,只将$tom的独有的元素添加至$user中。但 + 运算符实际也可被替代,在Php Inspections(EA Extended) 存在这样的提示:Perhaps array_merge/array_replace can be used instead. Feel free to disable the inspection if ‘+’ is intended。所以,在原来的函数基础上,调整一下替换顺序,array_replace($tom, $user),换一种思路:$user因为是基础数据,所以要让它作为替换数据源,而$tom为定制数据,所以它用来被替换,而独有的属性被保留。

中途看到其他作者博客的一个详细对比,十分明了

图片来源:https://p.softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

Leave a Reply

邮箱地址不会被公开。 必填项已用*标注