Html / PHP-Form-Input as array
У меня есть такая форма
<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="levels[1][build_time]" и так далее, но поскольку эти элементы добавляются динамически, было бы трудно добавить индекс. Есть ли другой способ?
Редактировать:
Как и было предложено, я изменил свою форму. Я также включил весь мой 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>
Выход I get now is:
[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
)
)
Я думаю, что это бы сработало, но все равно выглядит сложно. Нет лучшего способа?
4 ответа:
Просто добавьте
[]
к таким именам, как<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];
Если это нормально для вас, чтобы проиндексировать массив, вы можете сделать это:
<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 ) )
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 ) )