Имена полей ввода формы, содержащие квадратные скобки, такие как поле

Я видел много PHP-кода, который обрабатывает ввод формы, в котором имена полей ввода содержат квадратные скобки. Я понимаю, что это как-то приводит к массивам PHP, когда скрипт PHP проверяет переменную $ _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?

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

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

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

Каков механизм? В какой момент эти имена, содержащие только скобки, преобразуются в массивы? Является ли это признаком протокола HTPP? Из веб-серверов? Из языка PHP?>

Это особенность языка PHP. Фактически, протокол HTTP не запрещает использование нескольких идентичных параметров GET / POST. Согласно спецификации HTTP, следующее:

 foo=bar&foo=baz 

Не должно приводить к foo == baz . Это два параметра с двумя разными значениями. Тем не менее, PHP перезапишет бывшее foo последним, в результате чего $_POST['foo'] == 'baz' , даже если они могут быть разобраны отдельно.

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

Это зависит от точки зрения. В мире PHP это совершенно нормально, так как язык не поддерживает спецификацию нескольких параметров с тем же именем без использования скобок [] . В мире HTTP, хотя, foo != foo[] .

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

Точно так же, как массивы PHP, за исключением того, что вам не нужно указывать строковые ключи.

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

Да, ты можешь.

Насколько мне известно, это механизм внутреннего просмотра (и синтаксического анализа) элементов PHP, переданных через форму (GET / POST) с посттекстом [] и интерпретацией их как массива элементов. Протокол HTTP не волнует, он просто передает имя элемента с его связанным значением в строке запроса.

Это был обычный инструмент программирования, насколько я помню (я думаю, что я даже помню, что он чаще использовался для многофайловых загрузок, когда у вас были ссылки «добавить файл», которые добавили в форму другой элемент с тем же именем ( с [] ) как предыдущий.)

Те же правила, которые применяются в PHP, применяются в форме. Вы можете использовать [] для автоматической индексации элементов (для общих списков) или явно их перечислять с помощью идентификаторов элементов (например, файл [1], файл [2] и т. Д. (Следуя моему предыдущему примеру))

Да, можно использовать многомерные массивы.

Для получения дополнительной информации ознакомьтесь с самой собственной _POST-страницей PHP (особенно с комментариями)

  • Это полностью PHP-функция. HTTP ничего не знает о массивах. В http либо foo либо bar[baz] – это просто имена переменной

  • Это обычная практика

  • Используйте их, когда вам это удобно. Например: чтобы сгруппировать несколько полей, принадлежащих одному объекту, например news[title] + news[body]

  • Да. TIAS