在 PHP-5.4 之前定义数组只能用 array()
,但在 PHP0-5.4 之后可以用 []
,这个真是方便了太多,顺便还省了 5
个字符。像 array()
一样,list()
不是真正的函数,而是语言结构。list()
可以在单次操作内就为一组变量赋值。
变量赋值
- PHP 5 里,
list()
从最右边的参数开始赋值;PHP 7 里,list()
从最左边的参数开始赋值 - 出现在左值中的
[]
并不是数组的简写,是 list()
的简写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?php
list($hello, $world) = ['hello', 'world'];
var_dump($hello, $world);
[$new, $old] = ['new', 'old'];
var_dump($new, $old);
// 结果
string(5) "hello"
string(5) "world"
string(3) "new"
string(3) "old"
|
数组索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?php
[$a[0], $a[1], $a[2]] = ['hello', 'world', '!'];
var_dump($a);
// 结果
array(3) {
[0] =>
string(5) "hello"
[1] =>
string(5) "world"
[2] =>
string(1) "!"
}
|
互相嵌套
1
2
3
4
5
6
7
8
9
10
| <?php
// 不合法
list([$a, $b], [$c, $d]) = [[1, 2], [3, 4]];
// 不合法
[list($a, $b), list($c, $d)] = [[1, 2], [3, 4]];
// 合法
[[$a, $b], [$c, $d]] = [[1, 2], [3, 4]];
|
循环中使用
顺序索引
1
2
3
4
5
6
7
8
9
10
11
12
| <?php
$array = [['a', 'b'], ['c', 'd'], ['e', 'f']];
foreach ($array as $key => [$x, $y]) {
echo sprintf('第 %d 次循环的值:', $key + 1);
echo $x, '->', $y . PHP_EOL;
}
// 结果
第 1 次循环的值:a->b
第 2 次循环的值:c->d
第 3 次循环的值:e->f
|
指定索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <?php
$array = [
['x' => 'a', 'y' => 'b'],
['x' => 'c', 'y' => 'd'],
['x' => 'e', 'y' => 'f'],
];
foreach ($array as $key => ['x' => $x, 'y' => $y]) {
echo sprintf('第 %d 次循环的值:', $key + 1);
echo $x, '->', $y . PHP_EOL;
}
// 结果
第 1 次循环的值:a->b
第 2 次循环的值:c->d
第 3 次循环的值:e->f
|
允许指定键
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <?php
$array = ['x' => 1, 'y' => 2, 'z' => 3];
['x' => $x, 'y' => $y, 'z' => $z] = $array;
var_dump($x, $y, $z);
// 相当于
$x = $array['x'];
$y = $array['y'];
$z = $array['z'];
// 结果
int(1)
int(2)
int(3)
|
调整顺序
1
2
3
4
5
6
7
8
9
10
11
12
13
| <?php
// PHP 5 会报 PHP Notice: Undefined offset: 0...
list($a, $b) = [1 => 'a', 2 => 'b'];
// PHP 7 处理起来不费吹灰之力
[10 => $a, 11 => $b, 12 => $c] = [10 => 'a', 11 => 'b', 12 => 'c'];
var_dump($a, $b, $c);
// 结果
string(1) "a"
string(1) "b"
string(1) "c"
|
混合键
PHP 7 中 list()
支持混合形式的 key
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?php
// PHP 5 会报 PHP Notice: Undefined offset: 0...
list($a, $b, $c) = [1 => 'a', 'x' => 'b', 2 => 'c'];
// PHP 7 处理起来毫无压力
[10 => $a, 'x' => $b, 12 => $c] = [10 => 'a', 'x' => 'b', 12 => 'c'];
var_dump($a, $b, $c);
// 结果
string(1) "a"
string(1) "b"
string(1) "c"
|
复合形式
键名一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <?php
$array = [
['m' => 11, 'n' => 22],
['m' => 'hello', 'n' => 'world'],
['m' => true, 'n' => false],
];
[
['m' => $m1, 'n' => $n1],
['m' => $m2, 'n' => $n2],
['m' => $m3, 'n' => $n3],
]
= $array;
var_dump("$m1 $n1", "$m2 $n2", "$m3 $n3");
// 结果
string(6) "11 22"
string(12) "hello world"
string(3) "1 "
|
键名不同
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <?php
$array = [
'x' => ['a', 'b'],
'y' => [1, 2],
'z' => [true, false],
];
['x' => [$a, $b], 'y' => [$c, $d], 'z' => [$e, $f]] = $array;
var_dump("$a $b", "$c $d", "$e $f");
// 结果
string(3) "a b"
string(3) "1 2"
string(2) "1 "
|