Я понимаю основы использования входных имен 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]); }