Html/PHP - Форма - ввод как массив
У меня появилась такая форма
<form>
<input type="text" class="form-control" placeholder="Titel" name="levels[level]">
<input type="text" class="form-control" placeholder="Titel" name="levels[build_time]">
<input type="text" class="form-control" placeholder="Titel" name="levels[level]">
<input type="text" class="form-control" placeholder="Titel" name="levels[build_time]">
</form>
То, что я хотел бы иметь в качестве вывода $_POST, - это массив вроде
Array (
[1] => Array ( [level] => 1 [build_time] => 123 )
[2] => Array ( [level] => 2 [build_time] => 456 )
)
Я знаю, что могу сделать что-то вроде name= "уровней [1] [build_time]" и так далее, но поскольку эти элементы добавляются динамически, было бы сложно добавить индекс. Есть ли другой способ?
EDIT:
Как я уже сказал, я изменил свою форму. Я также включил весь свой HTML-код, потому что я думаю, что здесь что-то не хватает. Мой HTML сейчас:
<div class="form-group">
<label class="col-md-2">Name(z.B. 1)</label>
<div class="col-md-10">
<input type="text" class="form-control" placeholder="Titel" name="levels[][level]">
</div>
<label class="col-md-2">Bauzeit(In Sekunden)</label>
<div class="col-md-10">
<input type="text" class="form-control" placeholder="Titel" name="levels[][build_time]">
</div>
</div>
<div class="form-group">
<label class="col-md-2">Name(z.B. 1)</label>
<div class="col-md-10">
<input type="text" class="form-control" placeholder="Titel" name="levels[][level]">
</div>
<label class="col-md-2">Bauzeit(In Sekunden)</label>
<div class="col-md-10">
<input type="text" class="form-control" placeholder="Titel" name="levels[][build_time]">
</div>
</div>
Теперь я получаю вывод:
[levels] => Array (
[0] => Array ( [level] => 1 )
[1] => Array ( [build_time] => 234 )
[2] => Array ( [level] => 2 )
[3] => Array ( [build_time] => 456 )
)
Изменить 2:
Как было предложено в вашем редактировании, я отредактировал свою форму и переместил квадратные скобки в конец имени. Теперь я получаю вывод:
[levels] => Array (
[level] => Array (
[0] => 1
[1] => 2
)
[build_time] => Array (
[0] => 234
[1] => 456
)
)
Я предполагаю, что это будет работать, но все равно выглядит сложным. Нет лучшего способа?
Ответы
Ответ 1
Просто добавьте []
к таким именам, как
<input type="text" class="form-control" placeholder="Titel" name="levels[level][]">
<input type="text" class="form-control" placeholder="Titel" name="levels[build_time][]">
Возьмите этот шаблон, а затем вы можете добавить их даже с помощью цикла.
Затем вы можете добавить их динамически столько, сколько хотите, не указав индекс. PHP заберет их так же, как и ожидаемый пример сценария.
Edit
Извините, у меня были скобки в неправильном месте, что сделало бы каждое новое значение новым элементом массива. Теперь используйте обновленный код, и это даст вам следующую структуру массива.
levels > level (Array)
levels > build_time (Array)
Тот же индекс на обоих вспомогательных массивах даст вам вашу пару. Например
echo $levels["level"][5];
echo $levels["build_time"][5];
Ответ 2
Если вам удобно индексировать массив, вы можете это сделать:
<form>
<input type="text" class="form-control" placeholder="Titel" name="levels[0][level]">
<input type="text" class="form-control" placeholder="Titel" name="levels[0][build_time]">
<input type="text" class="form-control" placeholder="Titel" name="levels[1][level]">
<input type="text" class="form-control" placeholder="Titel" name="levels[1][build_time]">
<input type="text" class="form-control" placeholder="Titel" name="levels[2][level]">
<input type="text" class="form-control" placeholder="Titel" name="levels[2][build_time]">
</form>
... для достижения этого:
[levels] => Array (
[0] => Array (
[level] => 1
[build_time] => 2
)
[1] => Array (
[level] => 234
[build_time] => 456
)
[2] => Array (
[level] => 111
[build_time] => 222
)
)
Но если вы удалите одну пару входов (динамически, я полагаю) из середины формы, тогда вы получите дыры в своем массиве, если вы не обновите имена ввода...
Ответ 3
дополнительно:
для тех, у кого есть пустая переменная POST, не используйте это:
name="[levels][level][]"
скорее используйте это (как это уже здесь в этом примере):
name="levels[level][]"
Ответ 4
HTML: используйте имена как
<input name="levels[level][]">
<input name="levels[build_time][]">
PHP:
$array = filter_input_array(INPUT_POST);
$newArray = array();
foreach (array_keys($array) as $fieldKey) {
foreach ($array[$fieldKey] as $key=>$value) {
$newArray[$key][$fieldKey] = $value;
}
}
$newArray будет хранить данные, как вы хотите
Array (
[0] => Array ( [level] => 1 [build_time] => 123 )
[1] => Array ( [level] => 2 [build_time] => 456 )
)