PHP «список» вопрос: Почему результат в обратном порядке?

#php #arrays #list

#php #массивы #Список

Вопрос:

Не могли бы вы предоставить подробное объяснение, почему этот код:

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

приводит к:

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

?

Комментарии:

1. потому что так list() работает, см. документы php ( php.net/list )

2. array_reverse() решит все ваши проблемы!

Ответ №1:

Смотрите документы PHP для list :

list() присваивает значения, начинающиеся с самого правого параметра. Если вы используете обычные переменные, вам не нужно беспокоиться об этом. Но если вы используете массивы с индексами, вы обычно ожидаете, что порядок индексов в массиве будет таким же, как вы написали в list() слева направо; но это не так. Он присваивается в обратном порядке.

Если вы хотите знать, почему это так, то причина, вероятно, в том, что присваивание справа налево проще реализовать с помощью синтаксического анализатора LALR (1), где вы обычно используете только рекурсию левой стороны по соображениям производительности:

 assignment_list:
      assignment_list ',' assignment_list_element
    | assignment_list_element
;

assignment_list_element:
      variable    { zend_do_add_list_element(amp;$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); }
;
  

Комментарии:

1. Таким образом, самый правый $result[] установлен на $arr[0] . Что происходит тогда?

Ответ №2:

Потому что

list() присваивает значения, начинающиеся с самого правого параметра. Если вы используете обычные переменные, вам не нужно беспокоиться об этом. Но если вы используете массивы с индексами, вы обычно ожидаете, что порядок индексов в массиве будет таким же, как вы написали в list() слева направо; но это не так. Он присваивается в обратном порядке

Итак, фактический ответ таков: вот как список работает в PHP

Ответ №3:

Вы должны все объяснить по этой ССЫЛКЕ

В нем говорится:

list() присваивает значения, начинающиеся с самого правого параметра. Если вы используете обычные переменные, вам не нужно беспокоиться об этом. Но если вы используете массивы с индексами, вы обычно ожидаете, что порядок индексов в массиве будет таким же, как вы написали в list() слева направо; но это не так. Он присваивается в обратном порядке

Надеюсь, это поможет!