Submitting a class roster. Adding 3 students at once. Each student has first, last, age.
Question: How can we get all of the students in an array of arrays?
students[0] => Array (
["first"] => "first name for 0",
["last"] => "last name for 0",
["age"] => "age for 0"
),
students[1] => Array (
["first"] => "first name for 1",
["last"] => "last name for 1",
["age"] => "age for 1"
),
...
Details
For one student:
<input type="text" name="first">
<input type="text" name="last">
<input type="text" name="age">
We can return multiple students in separate arrays like this:
<input type="text" name="students[first][]">
<input type="text" name="students[last][]">
<input type="text" name="students[age][]">
which returns an array of firsts, lasts and ages
students["first"] = [array of first names]
students["last"] = [array of last names]
students["age"] = [array of ages]
Theoretically we can get all the info for a student by accessing the same index (say "3" for each array).
We do not want to programatically add an index in the form.
Do not want:
<input type="text" name="students[hardcoded_index][first]">
<input type="text" name="students[hardcoded_index][last]">
<input type="text" name="students[hardcoded_index][age]">
If for any reason it matters, we are using Rails for views but can use form helpers or HTML.
For those of you who want to process the data in a PHP enviroment , @messanjah's method won't work ,
The methods for parsing data like the built-in
serializeArray
orserialize
are not parsing it as expected either.This is what I tried so far ...
students[name]
students[][name]
- Very Strange since it was meant to automatically index the arraystudents[name][]
Neither of them worked, but this
students[<hardcoded-index>][name]
worked for PHP ,The method you choose to hard code the indexes is upto you , you can use a cleaner method by using javascript or you can manually hard code them initially in your form element.
Cheers
tl;dr: Add empty brackets (
[]
) afterstudents
to the input names.Fiddling with Rack::Utils.parse_nested_query it seems you can get the payload you want like this:
Note the empty brackets (
[]
) afterstudents
. This tells Rack you want thestudents
param to be an array. Subsequent params encountered (with the same name) will start a new element.POST /myroute?students[][first]=foo&students[][last]=bar&students[][age]=21&students[][first]=baz&students[][last]=qux&students[][age]=19
Gets parsed like this:
Further reading: http://codefol.io/posts/How-Does-Rack-Parse-Query-Params-With-parse-nested-query