web-dev-qa-db-ja.com

Html / PHP-フォーム-配列として入力

私はこのようなフォームを手に入れました

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

$ _POSTの出力として欲しいのは、次のような配列です

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

Name = "levels [1] [build_time]"などのようにできることは知っていますが、これらの要素は動的に追加されるため、インデックスを追加するのは難しいでしょう。他の方法はありますか?

編集:

提案どおり、フォームを変更しました。ここに何かが欠けていると思うので、HTML全体も含めました。今の私のHTML:

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

私が今得た出力は次のとおりです。

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

編集2:

編集で提案されたように、フォームを編集し、角括弧を名前の最後に移動しました。私が今得た出力は次のとおりです。

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

うまくいくと思いますが、それでも複雑に見えます。より良い方法はありませんか?

54
Evo_x

次のような名前に[]を追加するだけです

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

そのテンプレートを使用すると、ループを使用してもテンプレートを追加できます。

その後、インデックスを提供しなくても、必要なだけそれらを動的に追加できます。 PHPは、予想されるシナリオ例のようにそれらを選択します。

編集

申し訳ありませんが、間違った場所に中かっこがあり、すべての新しい値が新しい配列要素になりました。更新されたコードを今すぐ使用すると、次の配列構造が得られます

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

両方のサブ配列で同じインデックスを使用すると、ペアが得られます。例えば

echo $levels["level"][5];
echo $levels["build_time"][5];
75
Hanky Panky

配列のインデックスを作成してもよい場合は、これを行うことができます:

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

...それを達成するために:

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

しかし、フォームの中央から1組の入力を(動的に、私が推測すると)削除すると、入力名を更新しない限り、配列に穴ができます...

HTML:名前を次のように使用します

<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は必要に応じてデータを保持します

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

さらに、空のPOST変数がある場合は、これを使用しないでください。

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

むしろこれを使用します(この例で既にここにあるように):

name="levels[level][]"
7
mheg