Обрабатывает ли PHP многомерные массивы $_REQUEST?

#php #http #forms #multidimensional-array #request

#php #http #формы #многомерный массив #запрос

Вопрос:

Отличной особенностью PHP является то, что он обрабатывает массивы в переменных запроса, поэтому, если вы разместите строку типа ...amp;test[one]=twoamp;test[three]=four , вы сможете получить доступ test к массиву с помощью $_REQUEST['test'] .

Однако сегодня я обнаружил, что существует проблема с многомерными $_REQUEST массивами, и мне интересно, есть ли способ обойти это.

Для тестирования я использовал форму с полями:

 <input name="one[one]" />
<input name="one[two]" />
<input name="three[four[five]]" />
<input name="three[four[six]]" />
  

Как только это было отправлено, я использовал var_dump для просмотра структуры массива:

 array(3) {
  ["one"]=>
  array(2) {
    ["one"]=>
    string(0) ""
    ["two"]=>
    string(0) ""
  }
  ["three"]=>
  array(2) {
    ["four[five"]=>
    string(0) ""
    ["four[six"]=>
    string(0) ""
  }
}
  

one Элемент выполнен в виде массива, как и ожидалось. Но three элемент таковым не является. Теперь я бы не возражал, если бы это просто не поддерживалось, но меня смутила причина, по которой. Посмотрите на названия подэлементов three four[five и four[six . Он не интерпретируется как массив, потому что по какой-то причине был потерян завершающий код, ] который помог бы идентифицировать эти элементы как значения массива!

У кого-нибудь есть объяснение этому? Есть ли какой-либо способ обойти это, кроме как использовать максимум один уровень в $_REQUEST массивах?

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

1. Пожалуйста, прекратите использовать $_REQUEST. Это вредно.

2. @teresko: Пожалуйста, прекратите публиковать это. Это неверно.

Ответ №1:

Вместо этого попробуйте three[four][five] и three[four][six] .

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

1. Я все еще не понимаю, почему конечная ] информация удалялась.

2. Очевидно, это связано с тем, как PHP анализирует строку. Почему именно, я не знаю. Я не считаю, что стоит тратить время на открытие исходного кода PHP, чтобы выяснить это. Просто используйте правильный формат, а также помните о точках в именах полей. Смотрите php.net/manual/en/language.variables.external.php

Ответ №2:

Входные имена полностью соответствуют переменным «names».

Вы бы написали на PHP:

 $three['four']['five'] = 'trees';
  

Аналогично в вашем HTML:

 <input name="three[four][five]" value="trees" />