#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() слева направо; но это не так. Он присваивается в обратном порядке
Надеюсь, это поможет!