Подтвердить что ты не робот

Имена полей ввода формы, содержащие квадратные скобки, такие как поле [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?

  • Продолжая предыдущий вопрос, является ли это обычно используемым хаком или обычным программным инструментом?

  • Каковы (все) правила использования скобок в именах полей ввода?

  • Можно ли создать многомерные массивы таким образом?

4b9b3361

Ответ 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