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 41

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 )
)

В дополнение: для тех, у кого есть пустая переменная POST, не используйте это:

name="[levels][level][]"

Скорее используйте это (как это уже здесь в этом примере):

name="levels[level][]"