PHP“list"问题:为什么结果是相反的?


PHP "list" question: Why the result is in reverse order?

您能详细解释一下为什么这段代码:

$arr = array(1, 2, 3);
list($result[], $result[], $result[]) = $arr;
print_r($result);

结果:

Array ( [0] => 3 [1] => 2 [2] => 1 ) 

?

参见PHP文档list:

list()从最右边的参数开始赋值。如果您使用的是普通变量,则不必担心这个问题。但是如果你使用带下标的数组你通常期望数组中下标的顺序和你在list()中写的一样从左到右;事实并非如此。它以反向顺序赋值。

如果您想知道为什么这样做,那么原因可能是,使用LALR(1)解析器更容易实现从右到左的赋值,在LALR(1)解析器中,出于性能原因通常只使用左侧递归:

assignment_list:
      assignment_list ',' assignment_list_element
    | assignment_list_element
;
assignment_list_element:
      variable    { zend_do_add_list_element(&$1 TSRMLS_CC); }
    | T_LIST '('  { zend_do_new_list_begin(TSRMLS_C); } assignment_list ')' { zend_do_new_list_end(TSRMLS_C); }
    | /* empty */ { zend_do_add_list_element(NULL TSRMLS_CC); }
;

因为

list()从最右边的参数开始赋值。如果您使用的是普通变量,则不必担心这个问题。但是如果你使用带下标的数组你通常期望数组中下标的顺序和你在list()中写的一样从左到右;事实并非如此。按相反的顺序赋值

实际答案是:这就是PHP中list的工作方式

你有一切解释在这个链接…

它说:

list()从最右边的参数开始赋值。如果您使用的是普通变量,则不必担心这个问题。但是如果你使用带下标的数组你通常期望数组中下标的顺序和你在list()中写的一样从左到右;事实并非如此。它以相反的顺序赋值

希望有帮助!