在 PHP 7.1 中,我们可以执行以下操作
<?php
[$a, $b, $c] = ['a', 'b', 'c'];
?>
之前,我们必须执行以下操作
<?php
list($a, $b, $c) = ['a', 'b', 'c'];
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
list — 将变量赋值为数组
类似于 array(),这并不是真正的函数,而是一个语言结构。 list() 用于在一个操作中分配一系列变量。字符串无法解包,并且 list() 表达式不能完全为空。
注意:
在 PHP 7.1.0 之前,list() 仅适用于数字数组,并假设数字索引从 0 开始。
从 PHP 7.1.0 开始,list() 还可以包含显式键,允许解构具有非整数或非顺序键的数组。有关数组解构的更多详细信息,请参阅 数组解构部分。
var
一个变量。
vars
其他变量。
返回分配的数组。
版本 | 描述 |
---|---|
7.3.0 | 添加了对数组解构中引用赋值的支持。 |
7.1.0 | 现在可以在 list() 中指定键。这使得能够解构具有非整数或非顺序键的数组。 |
示例 #1 list() 示例
<?php
$info = array('coffee', 'brown', 'caffeine');
// 列出所有变量
list($drink, $color, $power) = $info;
echo "$drink is $color and $power makes it special.\n";
// 列出其中一些
list($drink, , $power) = $info;
echo "$drink has $power.\n";
// 或者让我们跳到第三个
list( , , $power) = $info;
echo "I need $power!\n";
// list() 不适用于字符串
list($bar) = "abcde";
var_dump($bar); // NULL
?>
示例 #2 list() 的示例用法
<?php
$result = $pdo->query("SELECT id, name FROM employees");
while (list($id, $name) = $result->fetch(PDO::FETCH_NUM)) {
echo "id: $id, name: $name\n";
}
?>
示例 #3 使用嵌套 list()
<?php
list($a, list($b, $c)) = array(1, array(2, 3));
var_dump($a, $b, $c);
?>
int(1) int(2) int(3)
示例 #4 list() 和索引定义的顺序
将由 list() 使用的数组的索引定义的顺序无关紧要。
<?php
$foo = array(2 => 'a', 'foo' => 'b', 0 => 'c');
$foo[1] = 'd';
list($x, $y, $z) = $foo;
var_dump($foo, $x, $y, $z);
给出以下输出(请注意元素的顺序与在 list() 语法中编写的顺序相比)
array(4) { [2]=> string(1) "a" ["foo"]=> string(1) "b" [0]=> string(1) "c" [1]=> string(1) "d" } string(1) "c" string(1) "d" string(1) "a"
示例 #5 带有键的 list()
从 PHP 7.1.0 开始,list() 现在还可以包含显式键,这些键可以作为任意表达式给出。允许混合整数和字符串键;但是,不能混合有键和无键的元素。
<?php
$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];
foreach ($data as ["id" => $id, "name" => $name]) {
echo "id: $id, name: $name\n";
}
echo PHP_EOL;
list(1 => $second, 3 => $fourth) = [1, 2, 3, 4];
echo "$second, $fourth\n";
以上示例将输出
id: 1, name: Tom id: 2, name: Fred 2, 4
在 PHP 7.1 中,我们可以执行以下操作
<?php
[$a, $b, $c] = ['a', 'b', 'c'];
?>
之前,我们必须执行以下操作
<?php
list($a, $b, $c) = ['a', 'b', 'c'];
?>
从 PHP 7.1 开始,可以指定键
示例
<?php
$array = ['locality' => 'Tunis', 'postal_code' => '1110'];
list('postal_code' => $zipCode, 'locality' => $locality) = $array;
print $zipCode; // 将输出 1110
print $locality; // 将输出 Tunis
?>
显示以下内容的示例
$info = array('kawa', 'brązowa', 'kofeina');
list($a[0], $a[1], $a[2]) = $info;
var_dump($a);
输出
array(3) {
[2]=>
string(8) "kofeina"
[1]=>
string(5) "brązowa"
[0]=>
string(6) "kawa"
}
这里需要注意的是,如果事先定义了数组,例如
$a = [0, 0, 0];
索引将按正确的顺序保留
array(3) {
[0]=>
string(4) "kawa"
[1]=>
string(8) "brązowa"
[2]=>
string(7) "kofeina"
}
认为值得一提。
如前所述,如果输入数组过短,list() 将报错。这可以通过 array_merge() 合并一些默认值来避免。例如
<?php
$parameter = 'name';
list( $a, $b ) = array_merge( explode( '=', $parameter ), array( true ) );
?>
但是,您必须使用足够长的数组进行 array_merge 以确保有足够的元素(如果 $parameter 为空,则上面的代码仍然会报错)。
另一种方法是在数组上使用 array_pad 来确保其长度(如果您需要添加的所有默认值都相同)。
<?php
$parameter = 'bob-12345';
list( $name, $id, $fav_color, $age ) = array_pad( explode( '-', $parameter ), 4, '' );
var_dump($name, $id, $fav_color, $age);
/* 输出
string(3) "bob"
string(5) "12345"
string(0) ""
string(0) ""
*/
?>
如果列表中缺少元素,指定默认值可能很方便。您可以为此使用运算符 +
<?php
$someArray = ['color' => 'orange'];
['color' => $color, 'size' => $size] = $someArray + ['color' => null, 'size' => null];
?>
这将避免您可能遇到的警告“未定义的数组键“size””。
<?php
/**
* 似乎可以跳过列出的值。
* 这是一个示例,说明我的意思。
*
* 仅供参考,与 PHP 7.1 简写列表语法一样有效。
* 在 PHP 5.6.30、7.1.5 上进行了测试
*/
$a = [ 1, 2, 3, 4 ];
// 这是 list 的常见用例
echo "解包所有值\n";
list($v1, $v2, $v3, $v4) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);
// 这就是我的意思:
echo "跳过中间\n";
list($v1, , , $v4) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);
echo "跳过开头\n";
list( , , $v3, $v4) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);
echo "跳过结尾\n";
list($v1, $v2, , ) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);
echo "保留中间\n";
list( , $v2, $v3, ) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);
示例说明以下内容
<?php
// list() 不适用于字符串
list($bar) = "abcde";
var_dump($bar);
// 输出:NULL
?>
但是,如果字符串在变量中,则使用 list() 似乎会将字符串视为数组
<?php
$string = "abcde";
list($foo) = $string;
var_dump($foo);
// 输出:string(1) "a"
?>
不要错过 PHP 7 中的简单数组模式匹配
<?php
[$a] = ['hello!'];
var_dump($a); // 'hello!'
$arr = [4 => 50];
[4 => $fifty] = $arr;
var_dump($fifty); // 50
$multidimensionalArray = [['id' => 15, 'email' => '[email protected]']];
[['id' => $id, 'email' => $email]] = $multidimensionalArray;
var_dump($id, $email); // 15 [email protected]
?>
list() 可以与 foreach 一起使用
<?php
$array = [[1, 2], [3, 4], [5, 6]];
foreach($array as list($odd, $even)){
echo "$odd is odd; $even is even", PHP_EOL;
}
?>
输出结果
===
1 is odd; 2 is even
3 is odd; 4 is even
5 is odd; 6 is even
list 结构似乎寻找的是一个连续的索引列表,而不是按顺序取元素。这段晦涩的语句的意思是,如果你 unset 了一个元素,list 不会简单地跳到下一个元素并将其赋值给变量,而是会将缺失的元素视为一个空变量。
$test = array("a","b","c","d");
unset($test[1]);
list($a,$b,$c)=$test;
print "\$a='$a' \$b='$b' \$c='$c'<BR>";
结果是
$a='a' $b='' $c='c'
而不是
$a='a' $b='c' $c='d'
像 <?php list($var1,$varN) = null ?> 这样设置_不会_引发 E_NOTICE(或其他错误),并且据我所知,它实际上等同于对 https://php.net/function.unset 中的 $var1,$varN 进行 https://php.net/function.unset 操作。
我注意到这一点,因为它与 PHP 触发 E_NOTICE 关于“未定义的偏移量”的事实形成了对比,“如果数组元素不足以填充列表”,正如 https://php.net/control-structures.foreach#control-structures.foreach.list 中所记录的那样,并且此处仅在 https://php.net/function.list#122951 中由 Mardaneus 指出。
为了完整起见,以下是一个 bash(1)(macos10.13 上的 v5.0 或 4.3)cli 测试,它为我的所有 PHP 版本(通过 macports.org 安装)产生了相同的结果。它也使用 Debian10 上的 bash5.0 对 php7.3 进行了测试
bash --noprofile --norc -c 'for php in php{{53..56},{70..73}};do for literal in "array()" null;do echo -n $php …=$literal:&&$php -n -d error_reporting=E_ALL -r "var_dump(list(\$var)=$literal);";done;done'
# 以上为每个版本产生相同的成对结果
php53 …=array()
Notice: Undefined offset: 0 in Command line code on line 1
array(0) {
}
# ... 至
php73 …=null:NULL
如果你的数组长度比定义的 list 长,list() 定义不会抛出错误。
<?php
list($a, $b, $c) = array("a", "b", "c", "d");
var_dump($a); // a
var_dump($b); // b
var_dump($c); // c
?>
对于 PHP 7.1 及更高版本,文档指出可以混合使用整数和字符串键,但不能混合使用有键和无键的元素。以下是一个示例,使用来自 getimagesize() 的混合键的数据
<?php
$data=[
0=> 160,
1 => 120,
2 => 2,
3 => 'width="160" height="120"',
'mime' => 'image/jpeg'
];
list(0=>$width,1=>$height,2=>$type,3=>$dimensions,'mime'=>$mime)=$data;
?>
在这里,还需要指定数字键,就像整个数组被视为关联数组一样。
如其他地方所述,list() 运算符可以用数组格式编写
<?php
[0=>$width,1=>$height,2=>$type,3=>$dimensions,'mime'=>$mime]=$data;
?>
这是我在文档中没有见过的。
从 PHP 7.1 开始,你可以使用短手列表解包,使用方括号,就像短手数组声明一样
<?php
$foo = ['a', 'b', 'c'];
// 短手数组定义
[$a, $b, $c] = $foo;
echo $a; // 显示 "a"
// 它与以下相同:
list($x, $y, $z) = $foo;
echo $x; // 显示 "a"
?>
list($a, $b, $c) = ["blue", "money", 32];
快捷方式
[$a, $b, $c] = ["blue", "money", 32];
从 PHP 7.1 版本开始,你可以在 list() 或其新的简写 [] 语法中指定键。这使得可以对具有非整数或非连续键的数组进行解构。
<?php
$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];
// list() 样式
list("id" => $id1, "name" => $name1) = $data[0];
// [] 样式
["id" => $id1, "name" => $name1] = $data[0];
// list() 样式
foreach ($data as list("id" => $id, "name" => $name)) {
// 此处的逻辑使用 $id 和 $name
}
// [] 样式
foreach ($data as ["id" => $id, "name" => $name]) {
// 此处的逻辑使用 $id 和 $name
}
从 7.1.0 开始,你可以直接使用数组,而无需 list()
<?php
[$test, $test2] = explode(",", "hello, world");
echo $test . $test2; // hello, world
?>
交换两个变量的简单示例
$a = 'hello';
$b = 'world';
list($a, $b) = [$b, $a];
echo $a . ' ' . $b; //显示 "world hello"
另一个示例
function getPosition($x, $y, $z)
{
// ...一些操作,例如 $x++...
return [$x, $y, $z];
}
list($x, $y, $z) = getPosition($x ,$y, $z);
从 PHP 7.1 开始,[] 可以作为现有的 list() 语法的替代方案
<?php
[$number, $message] = explode('|', '123|Hello World!');
?>
如果你希望使用你预期的未定义行为,例如,如果你希望
$b = ['a','b']; list($a, $b) = $b;
得到的结果是 $a=='a' 且 $b=='b',那么你可以简单地将 $b 转换为数组(即使它已经是数组)来创建一个副本。例如
$b = ['a','b']; list($a, $b) = (array)$b;
并获得预期的结果。
除非你在使用 list() 时指定了键,否则它期望传入的数组从 0 开始。
因此,以下代码将导致“Undefined offset: 0”的通知级警告,并且变量不会按预期填充
<?php
list($c1, $c2, $c3) = array [1 =>'a', 2 => 'b', 3 => 'c'];
var_dump($c1); // NULL
var_dump($c2); // string(1) "a"
var_dump($c3); // string(1) "b"
?>
未记录的行为
list($a,$b,$c) = null;
实际上就像
$a = null; $b = null; $c = null;
...因此相应地
list($rows[]) = null;
将增加 count($rows),就像你执行了 $rows[] = null; 一样。
注意这一点(例如)在从数据库检索整个表时,例如
while (list($rows[]) = $mysqlresult->fetch_row());
这将在 $rows 的最后一个元素中留下一个额外的“null”条目。
获取实际日期和时间值到变量中的简单方法。
list($day,$month,$year,$hour,$minute,$second) = explode('-',date('d-m-Y-G-i-s'));
echo "$day-$month-$year $hour".":".$minute.":".$second;