Html / PHP - 表单 - 作为数组输入

时间:2013-11-25 04:16:21

标签: php html html-input

我有一个这样的表格

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

我现在得到的输出是:

[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 个答案:

答案 0 :(得分:72)

只需将[]添加到

等名称即可
 <input type="text" class="form-control" placeholder="Titel" name="levels[level][]">
 <input type="text" class="form-control" placeholder="Titel" name="levels[build_time][]">

获取该模板,然后即使使用循环也可以添加它们。

然后,您可以根据需要动态添加它们,而无需提供索引。 PHP会像你预期的场景示例那样选择它们。

修改

抱歉,我在错误的位置使用了大括号,这会将每个新值作为新的数组元素。现在使用更新的代码,这将为您提供以下数组结构

levels > level (Array)
levels > build_time (Array)

两个子阵列上的相同索引将为您提供对。例如

echo $levels["level"][5];
echo $levels["build_time"][5];

答案 1 :(得分:26)

如果你可以索引数组,你可以这样做:

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

但是如果从表单中间删除一对输入(动态地,我猜),那么除非你更新输入名称,否则你会在数组中出现漏洞......

答案 2 :(得分:14)

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

答案 3 :(得分:7)

另外: 对于那些有空POST变量的人,不要使用它:

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

而不是使用它(因为它在本例中已经在这里):

name="levels[level][]"