php 7.4 的 Unpacking inside arrays (...)

微笑、不失礼 提交于 2019-12-08 10:38:31

总的说明

php 7.4 增加了一个很有意思的功能

这是官方说明:

Unpacking inside arrays

<?php$parts = ['apple', 'pear'];$fruits = ['banana', 'orange', ...$parts, 'watermelon'];// ['banana', 'orange', 'apple', 'pear', 'watermelon'];?>

针对这个功能,总共两种用法,除了示例中的,还有一个:

$fruits = [...$parts_1, ...$parts];这个功能跟array_merge非常类似。

所以,本文探讨这个特性的用法的时候,会针对+, array_merge和...进行比较。


首先,针对字符串主键,也就是关联数组的情况

$arr_a = ['a' => 'aa', 'b' => 'ab', 'c' => 'ac'];$arr_b = ['d' => 'bd', 'e' => 'be', 'c' => 'bc'];print_r([...$arr_a, ...$arr_b]);
直接报错:PHP Fatal error:  Uncaught Error: Cannot unpack array with string keys

也就是,不支持关联数组。

其次,针对数字主键的数组

看代码:

$arr_a = [1 => 'aa', 0 => 'a0', 2 => 'ab', 3 => 'ac'];

$arr_b = [3 => 'bd', 4 => 'be', 5=> 'bc'];

print_r([...$arr_a, ...$arr_b]);
print_r([1 => 'aa', 0 => 'a0', 2 => 'ab', 3 => 'ac',...$arr_b]);
print_r($arr_a + $arr_b);
print_r(array_merge($arr_a, $arr_b));

  返回是:

Array
(
    [0] => aa
    [1] => a0
    [2] => ab
    [3] => ac
    [4] => bd
    [5] => be
    [6] => bc
)
Array
(
    [1] => aa
    [0] => a0
    [2] => ab
    [3] => ac
    [4] => bd
    [5] => be
    [6] => bc
)
Array
(
    [1] => aa
    [0] => a0
    [2] => ab
    [3] => ac
    [4] => be
    [5] => bc
)
Array
(
    [0] => aa
    [1] => a0
    [2] => ab
    [3] => ac
    [4] => bd
    [5] => be
    [6] => bc
)

  

总结

针对网上说对,... 可以代替array_merge 的情况,我想说的是:洗洗睡吧,你想多了,完全就是一个新功能,没有跟他彻底一直的情况。

1. ... 功能很明显是针对索引数组的,对关联数组无效。

2. 针对索引数组的情况,[...$parts_1, ...$parts_2] 等同于array_merge.

3. ... 对数组进行索引了重排序。

 

结论:

新功能就是在一些特殊场合下能用一下的新功能而已,想替代array_merge是想多了。

而且,个人感觉不怎么实用,在php里面,好像很少有地方专门去区分索引数组和和关联数组。

所以:如果你不是c语言意义上的那种数组(连续数字主键),尽量别用这个吧,简直就是个坑啊!

 

另外说一句,php语言的数组是联合了其他语言的 数组,链表和哈希,综合而来,这一次的新功能,其实就是完全针对数组的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!