[$a, $b] = $array; 用一行代码把数组的元素拆分到不同的变量中:$a 得到 $array[0],$b 得到 $array[1]。list($a, $b) = $array; 是同一功能的较旧写法,['name' => $name] = $user; 则按键来拆分。
把解构和 explode() 搭配使用是最经典的用法:拆分字符串,给每一段起个名字,继续往下写。
跳过元素
把某个位置留空就能跳过它。你也可以提前结束:末尾没有用到的元素会被忽略。
按键解构关联数组
使用键时,数组中的顺序无关紧要,而且你只取需要的字段。键写在 => 前面,变量写在后面。
列表的模式也可以用同样的方式嵌套:[[$x1, $y1], [$x2, $y2]] = $line; 一次读取两个点。从 PHP 7.3 开始,模式中的变量还可以是引用,例如 [, &$second] = $counts;,这样修改 $second 就会修改数组。
一次赋值只能使用位置或键中的一种,不能混用。[$a, 'k' => $b] = $arr; 会以 Cannot mix keyed and unkeyed array entries in assignments 报错停止。
交换两个变量
用这两个值按相反的顺序构建一个数组,再把它解构回去。不需要临时变量。
从函数返回多个值
PHP 函数只返回一个值,但这个值可以是数组。在调用处解构,读起来就像返回了多个值。如果要返回的值超过两三个,就返回带键的数组,这样调用方不会把顺序弄混。
在 foreach 中解构
同样的语法也可以用在 foreach 那一行中,这样每一行数据到手时就已经拆分成有名字的变量了。人们说的“foreach 搭配 list()”指的就是这个。更多循环写法见 foreach 页面。
展开运算符(...)
三个点会就地展开一个数组。在数组字面量中,[...$a, ...$b] 用来合并数组。在函数调用中,f(...$args) 把元素作为独立的参数传入。在函数定义中,...$args 把多余的参数收集到一个数组中。
在 PHP 8.1 之前,展开带字符串键的数组会报错;现在字符串键会被保留,数字键会重新编号,规则和 array_merge() 相同。像 ...$amounts 这样的可变参数,和其他类型的参数一起在函数页面中讲解。
常见错误:元素比变量少
如果数组比模式短,缺少的变量会变成 null,PHP 还会为每个变量输出一条警告。处理你无法控制的输入时就会遇到这种情况,比如某一行缺少了字段。对于 [$name, $city, $country] = explode(',', 'Grace');,PHP 会输出:
Warning: Undefined array key 1 in /var/www/html/import.php on line 5
Warning: Undefined array key 2 in /var/www/html/import.php on line 5
先决定缺少的部分应该是什么值,在解构之前把数组补齐:
对于带键的模式,先合并默认值:['a' => $a, 'b' => $b] = $input + ['a' => null, 'b' => null];。+ 运算符只会添加 $input 中还没有的键。
常见问题
PHP 中的 list() 是做什么的?
list($a, $b) = $array; 把 $array[0] 赋值给 $a,把 $array[1] 赋值给 $b。从 PHP 7.1 开始,简写形式 [$a, $b] = $array; 的作用完全相同,而且两种写法都支持键:['id' => $id] = $row;。
PHP 中怎么交换两个变量?
把它们按相反的顺序组成一个新数组,再解构回去:[$a, $b] = [$b, $a];。不需要临时变量。
PHP 中 list() 能用于关联数组吗?
可以,从 PHP 7.1 开始支持。写出键名即可:['name' => $name, 'email' => $email] = $user; 或 list('name' => $name) = $user;。如果不写键,[$a, $b] = $user; 会去找键 0 和 1,得到 null 并产生一条警告。
PHP 中的三个点(...)是什么?
这是展开运算符。在数组字面量中,[...$a, ...$b] 把两个数组的元素复制到一个新数组里。在函数调用中,max(...$numbers) 把元素作为独立的参数传入。在函数定义中,function sum(...$numbers) 把任意数量的参数收集到一个数组中。
如果数组的元素比 list() 中的变量少,会发生什么?
多出来的变量会得到 null,PHP 还会输出一条警告,例如 Undefined array key 2。先补齐数组,例如 [$a, $b, $c] = array_pad($parts, 3, null);。