web-dev-qa-db-ja.com

HTMLフォーム:POSTオブジェクトの配列

クラス名簿の提出。一度に3人の生徒を追加します。各学生には、最初、最後の年齢があります。

質問:すべての生徒を配列の配列で取得するにはどうすればよいですか?

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"
), 
...  

詳細
1人の生徒の場合:

<input type="text" name="first">  
<input type="text" name="last">  
<input type="text" name="age">  

次のように、複数の学生を別々の配列で返すことができます。

<input type="text" name="students[first][]">  
<input type="text" name="students[last][]">  
<input type="text" name="students[age][]">  

これは、firsts、lasts、およびagesの配列を返します

students["first"] = [array of first names]
students["last"] = [array of last names]
students["age"] = [array of ages]  

理論的には、同じインデックスにアクセスすることで、学生のすべての情報を取得できます(各配列で「3」と言います)。

プログラムでフォームにインデックスを追加したくありません。
欲しくない:

<input type="text" name="students[hardcoded_index][first]">  
<input type="text" name="students[hardcoded_index][last]">  
<input type="text" name="students[hardcoded_index][age]">  

何らかの理由で重要な場合は、ビューにRailsを使用しますが、フォームヘルパーまたはHTMLを使用できます。

16
csi

tl; dr:空の角かっこ([])入力名のstudentsの後。

Rack :: Utils.parse_nested_query でいじくり回すと、次のように必要なペイロードを取得できるようです。

<!-- first student -->
<input type="text" name="students[][first]">
<input type="text" name="students[][last]">
<input type="text" name="students[][age]">

<!-- second student -->
<input type="text" name="students[][first]">
<input type="text" name="students[][last]">
<input type="text" name="students[][age]">

空の括弧([])の後studentsこれは、studentsパラメータを配列にすることをラックに指示します。 (同じ名前の)後続のparamsが出現すると、新しい要素が開始されます。

POST /myroute?students[][first]=foo&students[][last]=bar&students[][age]=21&students[][first]=baz&students[][last]=qux&students[][age]=19

次のように解析されます:

{"students" => [
  {
    "first" => "foo",
     "last" => "bar",
      "age" => "21"
  },
  {
    "first" => "baz",
     "last" => "qux",
      "age" => "19"
  }
]}

さらに読む: http://codefol.io/posts/How-Does-Rack-Parse-Query-Params-With-parse-nested-query

19
messanjah

質問が古いのはわかっていますが、将来の読者にも私の経験を追加したいと思います。

データを処理する PHP環境で、@ messanjahのメソッドは機能しません。

組み込みのserializeArrayserializeなどのデータを解析するメソッドも、期待どおりに解析していません。

これは私がこれまでに試したものです...

  • students[name]
  • students[][name]-配列に自動的にインデックスを付けることを意図していたため、非常に奇妙です
  • students[name][]

どちらも機能しませんでしたが、これはstudents[<hardcoded-index>][name][〜#〜] php [〜#〜]で機能しました

この方法に対する質問ですがですが、PHPここに上陸するユーザーにとっては便利です)近い将来、アスカーがRuby on Railsに必要でした。

methodインデックスをハードコーディングすることを選択するのはあなた次第です。javascriptを使用してよりクリーンな方法を使用するか、またはmanually hard cod eを使用できます。最初はフォーム要素にあります。

乾杯

10
Fahad