Имена полей ввода формы, содержащие квадратные скобки, такие как field [index] - PullRequest
20 голосов
/ 28 декабря 2010

Я видел много 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?

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

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

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

Ответы [ 3 ]

14 голосов
/ 28 декабря 2010

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

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

foo=bar&foo=baz

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

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

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

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

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

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

Да, вы можете.

5 голосов
/ 28 декабря 2010

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

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

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

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

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

3 голосов
/ 28 декабря 2010
  • Это полностью языковая функция php. HTTP ничего не знает о массивах. В http * foo или bar[baz] это просто имена переменных

  • Это нормальная практика

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

  • Да. TIAS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...