Html/PHP - Form - Input as array

非 Y 不嫁゛ 提交于 2019-11-26 00:33:41

问题


I got a form like this

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

What I\'d like to have as $_POST output is an array like

Array ( 
  [1] => Array ( [level] => 1 [build_time] => 123 ) 
  [2] => Array ( [level] => 2 [build_time] => 456 )
)

I know I could do something like name=\"levels[1][build_time]\" and so on but since these elements get added dynamically, it would be hard to add an index. Is there any other way?

EDIT:

As suggested, I changed my form. I also included my whole HTML now, because I think I\'m missing something here. My HTML now:

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

The output I get now is:

[levels] => Array ( 
  [0] => Array ( [level] => 1 ) 
  [1] => Array ( [build_time] => 234 ) 
  [2] => Array ( [level] => 2 ) 
  [3] => Array ( [build_time] => 456 ) 
)

Edit 2:

As suggested in your edit, I edited my form and moved the square brackets to the end of the name. The output I get now is:

[levels] => Array ( 
  [level] => Array ( 
    [0] => 1 
    [1] => 2 
  ) 
  [build_time] => Array ( 
    [0] => 234 
    [1] => 456 
  )
) 

I guess that would kinda work but it still looks complicated. No better way?


回答1:


Simply add [] to those names like

 <input type="text" class="form-control" placeholder="Titel" name="levels[level][]">
 <input type="text" class="form-control" placeholder="Titel" name="levels[build_time][]">

Take that template and then you can add those even using a loop.

Then you can add those dynamically as much as you want, without having to provide an index. PHP will pick them up just like your expected scenario example.

Edit

Sorry I had braces in the wrong place, which would make every new value as a new array element. Use the updated code now and this will give you the following array structure

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

Same index on both sub arrays will give you your pair. For example

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



回答2:


If is ok for you to index the array you can do this:

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

... to achieve that:

[levels] => Array ( 
  [0] => Array ( 
    [level] => 1 
    [build_time] => 2 
  ) 
  [1] => Array ( 
    [level] => 234 
   [build_time] => 456 
  )
  [2] => Array ( 
    [level] => 111
    [build_time] => 222 
  )
) 

But if you remove one pair of inputs (dynamically, I suppose) from the middle of the form then you'll get holes in your array, unless you update the input names...




回答3:


HTML: Use names as

<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 will hold data as you want

Array ( 
  [0] => Array ( [level] => 1 [build_time] => 123 ) 
  [1] => Array ( [level] => 2 [build_time] => 456 )
)



回答4:


in addition: for those who have a empty POST variable, don't use this:

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

rather use this (as it is already here in this example):

name="levels[level][]"


来源:https://stackoverflow.com/questions/20184670/html-php-form-input-as-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!