21、PHP 原生魅力 - 数组 - 合并数组

作者: 温新

图书: 【原生 PHP 魅力】

阅读: 147

时间: 2024-09-08 00:03:54

如果需要合并两个或更多的数组,可以选择使用 array_merge() 函数或者使用展开运算符(spread operator)。

array_merge() 数组合并

array_merge()函数合并或追加两个或更多的数组。如果有两个数组,第一个有 3 个元素,第二个有 4 个元素,array_merge()将返回一个包含 7 个元素的新数组。

<?php

$arr1 = [1,2,3];
$arr2 = [3,4,5,6];

print_r(array_merge($arr1, $arr2));

结果是一个包含 7 个元素的数组,其键从 0 开始,输出如下:

$ php 21-array-merge.php
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 3
    [4] => 4
    [5] => 5
    [6] => 6
)

非常好。现在我们来重点讨论一下数组中的键。在 PHP 中,数组是以映射的方式实现的,这是一种将值与键关联起来的数据结构类型。

键冲突:带有数值型键的数组合并

如果在合并操作过程中键是整数,那么这些键会被“重写”,因此你会得到一个键从0开始的新数组,而原始的键则不再重要。为了更清晰地理解,请考虑以下示例:

<?php

$arr1 = [0 => 'apple', 1 => 'banana'];
$arr2 = [0 => 'orange', 1 => 'grape'];

print_r(array_merge($arr1, $arr2));

结果是一个包含 4 个元素和新键的数组,输出如下:

$ php 21-array-merge.php
Array
(
    [0] => apple
    [1] => banana
    [2] => orange
    [3] => grape
)

key 是数字,则不会覆盖

键冲突:字符串键的数组合并

如果键是字符串类型,在合并操作中会保留原有的键。如果有键冲突的情况发生,只有最后一个具有相同键的元素会保留在合并后的数组中。来看一个示例以阐明这一点:

<?php

$arr1 = ['fruit' => 'apple', 'drink' => 'juice'];
$arr2 = ['fruit' => 'orange', 'snack' => 'chips'];

$mergedArray = array_merge($arr1, $arr2);

print_r($mergedArray);

在这个例子中,$arr1$arr2 都有一个名为 'fruit' 的键。当这两个数组被合并时,因为 'fruit' 键出现了冲突,所以只会保留$arr2中的'fruit' => 'orange'这一对键值,结果如下:

$ php 21-array-merge.php
Array
(
    [fruit] => orange
    [drink] => juice
    [snack] => chips
)

使用扩展运算符合并数组

展开运算符 ... 与数组一起使用时,可以将数组的元素展开。

<?php

$arr1 = ['a', 'b', 'c'];
$arr2 = ['d', 'e'];
var_dump(...$arr1, ...$arr2);

输出如下:

$ php 21-array-merge.php
string(1) "a"
string(1) "b"
string(1) "c"
string(1) "d"
string(1) "e"

通过展开运算符 (...) 合并数组涉及到将两个或多个数组的元素解包并组合成一个单一数组的过程。每个数组解包后的元素将成为新数组的元素,如下例所示:

<?php

$arr1 = ['a', 'b', 'c'];
$arr2 = [1,2, 3];
$arr3 = [true, false];

$mergeArr = [...$arr1, ...$arr2, ...$arr3];
print_r($mergeArr);

输出如下:

$ php 21-array-merge.php
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => 1
    [4] => 2
    [5] => 3
    [6] => 1
    [7] => 
)

注意:布尔值 true 转为了 1,false 转为空字符串。在 PHP 中,当布尔值被类型转换为字符串时,true 通常表示为 "1",而 false 表示为 ""(空字符串)。

使用展开运算符时,关于键冲突的解释与 array_merge() 函数的情形相同。这意味着,如果合并的数组中含有相同的字符串键,那么只有最后一个数组中该键对应的值会保留在结果数组中。而对于数值键,会展开并重新索引,从0开始。因此,展开运算符在处理键冲突时的行为,与 array_merge() 函数对不同类型键的处理方式一致。

<?php

$arr1 = ['fruit' => 'apple', 'drink' => 'juice'];
$arr2 = ['fruit' => 'orange', 'snack' => 'chips'];

$mergedArray = [...$arr1, ...$arr2];

print_r($mergedArray);

输出如下:

$ php 21-array-merge.php
Array
(
    [fruit] => orange
    [drink] => juice
    [snack] => chips
)
请登录后再评论