Как я могу использовать имена полей ввода формата массива в моей HTML-форме, которые отправляются на PHP?

Я понимаю основы использования входных имен HTML в формате массива. Если бы у меня была форма с переменным количеством входов «item», я мог бы сделать что-то вроде этого для каждого из них:

<input name='item[]' type='text' /> 

И когда я извлекаю элементы из массива $ _POST, я мог бы перебирать их так:

 $items = $_POST['item']; foreach($items as $item) { } 

Но мой вопрос несколько сложнее. У меня есть форма, в которой пользователи могут нажать кнопку «добавить один», и новая строка появится в нижней части формы. Каждая новая строка содержит вход «имя» и «описание».

Поэтому изначально я думал, что сделаю это:

 <input name='item[name][]' type='text' /> <input name='item[description][]' type='text' /> 

И затем перебирайте их так:

 $items = $_POST['item']; foreach($items as $item) { print $item['name'] . ' ' . $item['description']; } 

Но вместо того, чтобы работать, как я надеялся, вместо этого структурирует массив «item» таким образом, что я бы получил доступ к первому имени элемента как $item['name'][0] а не как $item[0]['name'] .

Итак, я перевернул его так, чтобы мои входы были названы таковыми:

 <input name='item[][name]' type='text' /> <input name='item[][description]' type='text' /> 

Но это привело к отдельному «элементу» для каждого «имени» и для каждого «описания», а не к группировке каждой пары в одном «элементе».

Мне очень не нравятся массивы «имя» и отдельный массив «описания». Я бы предпочел массивы «item» с каждым массивом, содержащим поле «имя» и «описание». Есть ли способ сделать это без создания индекса в моем javascript? Поскольку люди могут добавлять и удалять их динамически, очень сложно, чтобы мой javascript вычислил соответствующий индекс для следующего элемента. Нет ли способа сделать это в общем?

Невозможно сделать то, что вы хотите, но если это поможет, вот какой-то код, чтобы собрать его вместе, что, я думаю, будет работать (с item_name[] и item_description[] ):

 $items_desc = $_POST["item_description"]; $items_name = $_POST["item_name"]; $items = array(); for ($i = 0; $i < count($items_name); $i++) { $items[] = array("name" => $items_name[$i], "description" => $items_desc[$i]); }