# list

(PHP 4, PHP 5, PHP 7)

list — 把数组中的值赋给一组变量

### 说明

list ( mixed `$var1` [, mixed `$...` ] ) : array

像 array() 一样，这不是真正的函数，而是语言结构。 list() 可以在单次操作内就为一组变量赋值。

> Note:

> 在 PHP 7.1.0 之前的版本，list() 仅能用于数字索引的数组，并假定数字索引从 0 开始。

Warning

PHP 5 里，list() 从最右边的参数开始赋值； PHP 7 里，list() 从最左边的参数开始赋值。

如果你用单纯的变量，不用担心这一点。 但是如果你用了具有索引的数组，通常你期望得到的结果和在 list() 中写的一样是从左到右的，但在 PHP 5 里实际上不是， 它是以相反顺序赋值的。

通常而言，不建议依赖于操作的顺序，在未来可能会再次发生修改。

Warning

在 list() 执行过程中修改数组（比如使用 list($a, $b) = $b）将会产生不可预知的结果。

### 参数

`var1`

  一个变量。

### 返回值

返回指定的数组。

### 更新日志

版本 | 说明
--- | ---
7.1.0 | 现在可以指定 list() 中的键。 这就可以解构非数字键或者无顺序的数组。
7.0.0 | 赋值操作的顺序发生了变化。
7.0.0 | list() 表达式不再可以完全为空。
7.0.0 | 字符串无法再被拆包（unpack）。

### 范例

Example #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
    ?>

Example #2 list() 用法的一个例子

    <table>
     <tr>
      <th>Employee name</th>
      <th>Salary</th>
     </tr>

    <?php

    $result = $pdo->query("SELECT id, name, salary FROM employees");
    while (list($id, $name, $salary) = $result->fetch(PDO::FETCH_NUM)) {
        echo " <tr>\n" .
              "  <td><a href=\"info.php?id=$id\">$name</a></td>\n" .
              "  <td>$salary</td>\n" .
              " </tr>\n";
    }

    ?>

    </table>

Example #3 使用嵌套的 list()

    <?php

    list($a, list($b, $c)) = array(1, array(2, 3));

    var_dump($a, $b, $c);

    ?>

    int(1)
    int(2)
    int(3)

Example #4 在 list() 中使用数组索引

    <?php

    $info = array('coffee', 'brown', 'caffeine');

    list($a[0], $a[1], $a[2]) = $info;

    var_dump($a);

    ?>

产生如下输出（注意单元顺序和 list() 语法中所写的顺序的比较）：

Output of the above example in PHP 7:

    array(3) {
      [0]=>
      string(6) "coffee"
      [1]=>
      string(5) "brown"
      [2]=>
      string(8) "caffeine"
    }

Output of the above example in PHP 5:

    array(3) {
      [2]=>
      string(8) "caffeine"
      [1]=>
      string(5) "brown"
      [0]=>
      string(6) "coffee"
    }

Example #5 list() 和索引顺序定义

list() 使用 array 索引的顺序和它何时定义无关。

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

Example #6 带键的 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

### 参见

- each() - 返回数组中当前的键／值对并将数组指针向前移动一步
- array() - 新建一个数组
- extract() - 从数组中将变量导入到当前的符号表