一、list()到底是什么
PHP里的list()不是一个普通函数,准确说它是一种语言结构(languageconstruct),作用是在一次操作中把数组里的值分别赋给一组变量。它从PHP4.0开始就有了,算得上是PHP数组操作里比较早的一批工具。
很多人第一次看到list($a,$b,$c)=$my_array;会觉得有点别扭,因为等号左边是"函数调用"的样子,右边才是数组。这其实是PHP的一种特殊语法糖,专门用来做数组解构。你把它理解成"批量赋值"就行,不用纠结它为什么长得不像函数。
语法形式:
list($var1, $var2, ...) = $array;
参数方面,$var1是必须的,后面的变量可选,数量根据你要接收的值来定。
需要注意一点:list()在官方文档里写的返回值是"被赋值的数组",但在使用中,我们几乎不会去接它的返回值,都是直接用它完成赋值动作。所以这个返回值在开发里存在感很低。
二、基础用法,从代码号学习编程的示例说起
先看一个最直接的例子:
<?php
$cars = array("audi", "ford", "toyota");
list($a, $b, $c) = $cars;
echo "我喜欢的车有 $a、$b 和 $c。";
?>
输出:
我喜欢的车有 audi、ford 和 toyota。
这段代码里,$cars数组的三个元素按顺序分别落到了$a、$b、$c三个变量上。顺序是对应的,第一个元素给第一个变量,第二个给第二个,以此类推。
这里有个细节值得说:list()默认按索引顺序取值。对于索引数组,就是0、1、2这样往下走。如果你的数组不是从0开始的连续索引,结果可能和你预期不一样,这一点后面会展开。
三、跳过某些值,用空位占坑
有时候你只关心数组里的某几个值,中间的不需要。list()允许你留空:
<?php
$brands = array("audi", "bmw", "mercedes");
list($a, , $c) = $brands;
echo "这里只用了 $a 和 $c 两个变量。";
?>
输出:
这里只用了 audi 和 mercedes 两个变量。
中间那个逗号前面什么都不写,就表示"这个位置的值我不要"。这种写法在解析固定格式数据时挺方便,比如你只想要第1个和第3个字段,中间那个直接跳过,不用专门建个变量去接。
我个人的习惯是:如果跳过的位置超过两个,会考虑是不是用关联数组或者别的取值方式更清楚。毕竟list($a,,,,$e)这种写法,过两天自己回来看都要数逗号。
四、再换一组示例巩固一下
<?php
$subjects = array("php", "javascript", "html");
list($x, $y, $z) = $subjects;
echo "我比较熟的是 $x,$y 和 $z。";
?>
输出:
我比较熟的是 php,javascript 和 html。
再看一个带跳过的版本:
<?php
$subject = array("php", "javascript", "asp.net");
list($x, , $z) = $subject;
echo "我们讲过了 $x 和 $z,还有其他一些内容。";
?>
输出:
我们讲过了 php 和 asp.net,还有其他一些内容。
这两个例子放在一起看,能明显感觉到list()的节奏:左边变量列表和右边数组元素一一对应,不想要的留空。
五、几个容易踩的坑
坑一:索引不连续
<?php
$arr = array(1 => "a", 2 => "b");
list($x, $y) = $arr;
// $x 和 $y 都是 null
?>
list()取的是索引0、1、2……,你数组从1开始,那0位置就是空的,赋过去自然是null。这种情况要么先用array_values()重整索引,要么改用其他方式。
坑二:元素不够
<?php
$arr = array("a");
list($x, $y) = $arr;
// $y 是 null,并且会产生一个 notice
?>
数组元素比变量少时,多出来的变量会拿到null,PHP还会给你一个notice提醒。写代码时很好保证两边数量对得上,或者心里有数。
坑三:和each()搭配的老写法
早期PHP里常见这种循环:
while (list($key, $value) = each($array)) {
// ...
}
但each()在PHP7.2被废弃,PHP8.0移除。现在应该用foreach:
foreach ($array as $key => $value) {
// ...
}
这就是典型的"为什么不用"的问题。list()配each()的写法在旧项目里还能见到,但新代码不建议再这么写,foreach更直观,也没有废弃风险。
六、本节课程知识要点
-
list()是语言结构,不是普通函数,用于数组解构赋值。 -
赋值按索引顺序进行,索引数组最适用。
-
用空位逗号可以跳过不需要的值。
-
数组索引不连续或元素数量不匹配时,容易得到null。
-
新项目里遍历数组优先用
foreach,不要再用each()配list()的老组合。 -
list()的返回值在开发中基本用不到,重点是它的赋值行为。
七、一点个人看法
list()在PHP7.1之后有了一个更顺手的替代品:短数组语法解构,也就是[$a,$b,$c]=$array;。写法更短,语义一样,还能用在foreach里。所以我现在的习惯是:新代码能用[]就用[],list()更多是在维护老项目时遇到。
但理解list()仍然有必要。一来老代码里到处都是,二来有些场景下list()的写法反而更显眼,一眼能看出这里在做解构。工具没有绝对的好坏,看场合用。
如果你刚开始学PHP,建议两个都掌握,先知道list()怎么回事,再了解[]解构的写法,这样读别人的代码不会卡壳。