← PHP中的ksort():按键名升序排序数组 PHP array_map()函数:批量处理数组元素的实用工具 →

PHP list()函数:一次赋值多个变量的实用技巧

著
原创 2026-10-08 PHP 已有人查阅

一、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()怎么回事,再了解[]解构的写法,这样读别人的代码不会卡壳。

← PHP中的ksort():按键名升序排序数组 PHP array_map()函数:批量处理数组元素的实用工具 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号