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语言的数组是联合了其他语言的 数组,链表和哈希,综合而来,这一次的新功能,其实就是完全针对数组的。
php 7.4 的 Unpacking inside arrays (...)的更多相关文章
- PHP 7.4.0发布!一起看看有哪些新特性
PHP 7.4.0 发布了,此版本标志着 PHP 7 系列的第四次特性更新. 看了英文手册后,发现其进行了许多改进,并带来了一些新特性,现在将这些新特性您: 1.Typed Properties 类型 ...
- PHP 7.4.0 发布
近日,PHP 7.4.0 发布了,此版本标志着 PHP 7 系列的第四次特性更新. PHP 7.4.0 进行了许多改进,并带来了一些新特性,包括: Typed Properties 类型属性 类属性 ...
- php7.4 更新特性
PHP 7.4.0 Released! The PHP development team announces the immediate availability of PHP 7.4.0. This ...
- Top 10 Mistakes Java Developers Make--reference
This list summarizes the top 10 mistakes that Java developers frequently make. #1. Convert Array to ...
- Golang学习--TOML配置处理
上一篇文章中我们学会了使用包管理工具,这样我们就可以很方便的使用包管理工具来管理我们依赖的包. 配置工具的选择 但我们又遇到了一个问题,一个项目通常是有很多配置的,比如PHP的php.ini文件.Ng ...
- Golang 的 TOML库
TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner. TOML 的目标是成为一个极简的配 ...
- PatentTips - Sprite Graphics Rendering System
BACKGROUND This disclosure relates generally to the field of computer graphics. More particularly, b ...
- TOML配置文件
Toml是一种易读.mini语言,由github前CEO,Tom创建.Tom's Obvious, Minimal Language. TOML致力于配置文件的小型化和易读性.wiki:https:/ ...
- Core Java Volume I — 3.10. Arrays
3.10. ArraysAn array is a data structure that stores a collection of values of the same type. You ac ...
随机推荐
- 强大的CompletableFuture
引子 为了让程序更加高效,让CPU最大效率的工作,我们会采用异步编程.首先想到的是开启一个新的线程去做某项工作.再进一步,为了让新线程可以返回一个值,告诉主线程事情做完了,于是乎Future粉墨登场. ...
- 5. SOFAJRaft源码分析— RheaKV中如何存放数据?
概述 上一篇讲了RheaKV是如何进行初始化的,因为RheaKV主要是用来做KV存储的,RheaKV读写的是相当的复杂,一起写会篇幅太长,所以这一篇主要来讲一下RheaKV中如何存放数据. 我们这里使 ...
- 使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API
1. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作 什么是REST REST一词最早是在2000年,由Roy Fielding在他的博士论文<Archit ...
- 阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费
背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝 ...
- JavaScript中继承的实现方法--详解
最近看<JavaScript王者归来>中关于实现继承的方法,做了一些小总结: JavaScript中要实现继承,其实就是实现三层含义:1.子类的实例可以共享父类的方法:2.子类可以覆盖父类 ...
- 从壹开始 [ Ids4实战 ] 之五 ║ 多项目集成统一认证中心的思考
前言 哈喽大家好,好久都没有写文章了,这次又重新开始写技术文章了,半年前我还是一直保持每周都写文章的,后来是为了响应群友的号召,开始踏上了录制视频(https://www.bilibili.com/v ...
- mount 和 /etc/fstab关系。
mount -a 自动按照格式执行/etc/fstab里面的文件. /etc/fstab 文件格式: device mount-point type options ...
- css3 transform做动画
css3 transform做动画第一种用关键帧 这里就不说了 就说第二种方法用 transition属性 ps:1jquery anim不支持transform动画 但css还是支. 2 css3关 ...
- ThinkPHP6 核心分析:系统服务
什么是系统服务?系统服务是对于程序要用到的类在使用前先进行类的标识的绑定,以便容器能够对其进行解析(通过服务类的 register 方法),还有就是初始化一些参数.注册路由等(不限于这些操作,主要是看 ...
- [LC]203题 Remove Linked List Elements (移除链表元素)(链表)
①英文题目 Remove all elements from a linked list of integers that have value val. Example: Input: 1-> ...