Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HTML/PHP - Form - Input as array

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> 

I'd like to have as $_POST output 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 another way?


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

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 kind of work, but it still looks complicated. Isn’t there a better way?

like image 556
Evo_x Avatar asked Nov 25 '13 04:11

Evo_x


People also ask

How do you create an array in HTML form?

wrap your <input> elements in a <fieldset> element, and possibly give the fieldset an ID, some classes, or whatever you'd like. then make sure that the input names use the correct array structure: players[NUMBER][firstName] and players[NUMBER][lastName] should work fine (NUMBER of course being replaced by an index).

How do you input an array in HTML?

var input = document. getElementsByName('array[]'); The document. getElementsByName() method is used to return all the values stored under a particular name and thus making input variable an array indexed from 0 to number of inputs.

How do you post an array in PHP?

Copy $name = $_POST['name']; echo $name"<br/>"; But, if we have to send an array of data from the form, we should add the [] sign after the value of the name attribute. For example, we will need to send an array of data from a form while working with checkboxes.


2 Answers

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]; 
like image 90
Hanky Panky Avatar answered Oct 04 '22 14:10

Hanky Panky


If it 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 this:

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

like image 29
Nuno Rafael Figueiredo Avatar answered Oct 04 '22 15:10

Nuno Rafael Figueiredo