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?
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).
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.
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.
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];
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...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With