Имена полей ввода формы, содержащие квадратные скобки, такие как поле [index]
Я видел много PHP-кода, который обрабатывает ввод формы, в котором имена полей ввода содержат квадратные скобки. Я понимаю, что это как-то приводит к массивам PHP, когда PHP script анализирует переменную $_POST.
Пример HTML:
<form action='http://zzz.com' method='post'>
<input name='fruit[1]' value='apple' />
<input name='fruit[2]' value='banana' />
</form>
Пример URL:
http://zzz.com?fruit[1]=apple&fruit[2]=banana
Пример PHP:
assert($_POST['fruit'] === array(1=>'apple', 2=>'banana'));
Мои вопросы:
-
Каков механизм этого? В какой момент эти имена, содержащие скобки, преобразуются в массивы? Является ли это признаком протокола HTTP? Из веб-серверов? Из языка PHP?
-
Продолжая предыдущий вопрос, является ли это обычно используемым хаком или обычным программным инструментом?
-
Каковы (все) правила использования скобок в именах полей ввода?
-
Можно ли создать многомерные массивы таким образом?
Ответы
Ответ 1
Каков механизм? При этом укажите эти имена, которые просто содержат скобки преобразуются в массивы? Является это особенность протокола HTPP? Из веб-серверов? Из языка PHP? >
Это особенность языка PHP. Фактически, протокол HTTP не запрещает использование нескольких идентичных параметров GET/POST. Согласно спецификации HTTP, следующее:
foo=bar&foo=baz
Не следует foo == baz
. Это два параметра с двумя разными значениями. Тем не менее, PHP перезапишет предыдущий foo
последним, в результате получится $_POST['foo'] == 'baz'
, даже если они могут быть разобраны отдельно.
Продолжая предыдущий вопрос, это обычно используемый хак или нормальный инструмент программирования?
Это зависит от точки зрения. В мире PHP это совершенно нормально, так как язык не поддерживает спецификацию нескольких параметров с тем же именем без использования скобок []
. Однако в мире HTTP foo != foo[]
.
Какие (все) правила использования скобки в именах полей ввода?
То же, что и массивы PHP, за исключением того, что вам не нужно указывать строковые ключи.
Можно создать многомерные массивы таким образом?
Да, вы можете.
Ответ 2
Насколько я знаю, это механизм внутреннего просмотра (и синтаксического анализа) элементов PHP, переданных через форму (GET/POST) с постфиксным сообщением []
и интерпретацией их как массива элементов. Протокол HTTP не волнует, он просто передает имя элемента с его связанным значением в строке запроса.
Это был обычный инструмент программирования, насколько я помню (я думаю, что даже помню, что он чаще использовался для многофайловых загрузок, когда у вас были ссылки "добавить файл", которые добавили еще один элемент в форму, используя то же имя (с []
) как предыдущее.)
В форме применяются те же правила, которые применяются в PHP. Вы можете использовать []
, чтобы автоматически индексировать элементы (для общих списков) или явно перечислять их с помощью идентификаторов элементов (например, файл [1], файл [2] и т.д. (В соответствии с моим предыдущим примером))
Да, можно использовать многомерные массивы.
Для получения дополнительной информации, посмотрите PHP очень собственный _ Документация POST (особенно комментарии)
Ответ 3
-
Это полностью функция языка php. HTTP ничего не знает о массивах. В http либо foo
или bar[baz]
- это просто имена переменной
-
Это обычная практика.
-
Используйте их, когда они вам удобны. Например: чтобы сгруппировать несколько полей, принадлежащих одному объекту, например news[title]
+ news[body]
-
Да. TIAS