目录

PHP7 中的 list

在 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 "