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

Evo*_*o_x 57 html php 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>
Run Code Online (Sandbox Code Playgroud)

我想要的是$ _POST输出是一个类似的数组

Array ( 
  [1] => Array ( [level] => 1 [build_time] => 123 ) 
  [2] => Array ( [level] => 2 [build_time] => 456 )
)
Run Code Online (Sandbox Code Playgroud)

我知道我可以做一些像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>
Run Code Online (Sandbox Code Playgroud)

我现在得到的输出是:

[levels] => Array ( 
  [0] => Array ( [level] => 1 ) 
  [1] => Array ( [build_time] => 234 ) 
  [2] => Array ( [level] => 2 ) 
  [3] => Array ( [build_time] => 456 ) 
)
Run Code Online (Sandbox Code Playgroud)

编辑2:

根据您的编辑建议,我编辑了表单并将方括号移到了名称的末尾.我现在得到的输出是:

[levels] => Array ( 
  [level] => Array ( 
    [0] => 1 
    [1] => 2 
  ) 
  [build_time] => Array ( 
    [0] => 234 
    [1] => 456 
  )
) 
Run Code Online (Sandbox Code Playgroud)

我想这有点工作,但看起来仍然很复杂.没有更好的方法?

Han*_*nky 81

只需添加[]这些名称即可

 <input type="text" class="form-control" placeholder="Titel" name="levels[level][]">
 <input type="text" class="form-control" placeholder="Titel" name="levels[build_time][]">
Run Code Online (Sandbox Code Playgroud)

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

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

编辑

对不起,我在错误的地方有大括号,这会使每个新值成为一个新的数组元素.现在使用更新的代码,这将为您提供以下数组结构

levels > level (Array)
levels > build_time (Array)
Run Code Online (Sandbox Code Playgroud)

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

echo $levels["level"][5];
echo $levels["build_time"][5];
Run Code Online (Sandbox Code Playgroud)


Nun*_*edo 33

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

<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>
Run Code Online (Sandbox Code Playgroud)

......实现这一目标:

[levels] => Array ( 
  [0] => Array ( 
    [level] => 1 
    [build_time] => 2 
  ) 
  [1] => Array ( 
    [level] => 234 
   [build_time] => 456 
  )
  [2] => Array ( 
    [level] => 111
    [build_time] => 222 
  )
) 
Run Code Online (Sandbox Code Playgroud)

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


小智 15

HTML:使用名称作为

<input name="levels[level][]">
<input name="levels[build_time][]">
Run Code Online (Sandbox Code Playgroud)

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;
    }
}  
Run Code Online (Sandbox Code Playgroud)

$ newArray将根据需要保存数据

Array ( 
  [0] => Array ( [level] => 1 [build_time] => 123 ) 
  [1] => Array ( [level] => 2 [build_time] => 456 )
)
Run Code Online (Sandbox Code Playgroud)

  • 我不确定为什么这会被投票,但这正是我所需要的. (2认同)

小智 7

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

name="[levels][level][]"
Run Code Online (Sandbox Code Playgroud)

而是使用它(因为它已经在这个例子中):

name="levels[level][]"
Run Code Online (Sandbox Code Playgroud)