php 7.4 的 Unpacking inside arrays (...)
总的说明
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语言的数组是联合了其他语言的 数组,链表和哈希,综合而来,这一次的新功能,其实就是完全针对数组的。