对称阵列解构

官方解释:短数组语法([])现在可以用于将数组的值赋给一些变量(包括在foreach中)。 这种方式使从数组中提取值变得更为容易。

以下是官方示例:但是经过我测试(PHP Version 7.1.5),是一个错误的例子

<?php
$data = [
    ['id' => 1, 'name' => 'Tom'],
    ['id' => 2, 'name' => 'Fred'],
];

while (['id' => $id, 'name' => $name] = $data) {
    // logic here with $id and $name
}

我们知道在 PHP5.4 之前只能通过 array() 来定义数组,5.4之后添加了 [] 的简化写法(省略了5个字符还是很实在的)。

<?php
// 5.4 之前
$array = array(1, 2, 3);
$array = array("a" => 1, "b" => 2, "c" => 3);

// 5.4 及之后
$array = [1, 2, 3];
$array = ["a" => 1, "b" => 2, "c" => 3];

引申到另外一个问题上,如果我们要把数组的值赋值给不同的变量,可以通过 list 来实现:

<?php
list($a, $b, $c) = $array;

list($a,$b)=array(10,20);
echo $a,'~',$b,'<br />';
//返回10~20

list($a,$b,,$c)=array(2=>10,3=>20,4=>30,1=>40);
echo $a,'~',$b,'~',$c,'<br />';
//返回notice~40~20
//执行到$a的时候返回给我一个notice:说数组没有0键

为什么会返回这个notice~40~20呢? 查看解释

PHP7.1 实现了一下特性。但是要注意的是:出现在左值中的 [] 并不是数组的简写,是 list() 的简写。

但是并不仅仅如此,新的 list() 的实现并不仅仅可以出现在左值中,也能在 foreach 循环中使用:

$data = [
    ['id' => 1, 'name' => 'Tom'],
    ['id' => 2, 'name' => 'Fred'],
];


foreach ($data as ['id' => $id, 'name' => $name]) {
    echo $id . PHP_EOL;
    echo $name. PHP_EOL;
}

结果:

id:1 name:Tom id:2 name:Fred

不过因为实现的问题,list()[]不能相互嵌套使用:

Last updated