HTMLのFORMから2次元配列をPOSTする方法

今までFORMから2次元配列がPOSTできることを知らなかった・・・ そんなわけで2次元配列をPOSTする方法。

<form method=”post” name=”form”>
<input name=”array1[]” type=”hidden” value=”11″ />
<input name=”array1[]” type=”hidden” value=”22″ />
<input name=”array1[]” type=”hidden” value=”33″ />
<input name=”array1[]” type=”hidden” value=”44″ />
<input name=”array2[]” type=”hidden” value=”55″ />
<input name=”array2[]” type=”hidden” value=”66″ />
<input name=”array2[]” type=”hidden” value=”77″ />
<input name=”array2[]” type=”hidden” value=”88″ />
<input name=”send” type=”submit” />
</form>

こんな感じでPOSTしてやると、

Array
(
[array1] => Array
(
[0] => 11
[1] => 22
[2] => 33
[3] => 44
)

[array2] => Array
(
[0] => 55
[1] => 66
[2] => 77
[3] => 88
)
)

こんな感じに受け取れます。
うーん、今まで必死でformにユニークな名前つけてたのは何だったんだ・・・

////////////////////////////////////////////////
2011/10/12 追記:
この記事で紹介した方法は2次元配列とは呼べない、とのご指摘を頂きました。
今読むと確かにそうですね・・・。もっと良い方法をIQ様より頂きましたので、この記事のコメント欄をご覧下さい。

Comments:2

IQ 11-10-11 (火) 18:16

PHP Version 5.3.5 で実験した結果ですが、この記事の例では二次元配列を PSOT できませんでした。
var_dump[$_POST] した結果は同じものが得られましたが、結果を見て明らかな通り、array1 と array2 という一次元配列ができているだけで、二次元配列にはなっていないようです。
例えば、以下の様な方法を用いることで、二次元配列の様に POST データにアクセスすることはできますが、汎用性が無くなってしまいます。

for ($i = 1; $i <= 2; $i++) {
    for ($j = 0; $j < count($_POST["array".$i]); $j++) {
        echo $_POST["array".$i][$j]."<br />";
    }
}

また、他の PHP バージョンでは試していませんが、おそらくこの記事の方法では実現できないものと想像できます。

以下は、二次元配列を POST する為、個人的に実験した結果です。
$_POST が以下に示す $TMP_POST の様なデータであれば二次元配列として受け取れていることになります。

$TMP_POST = array("array" => array(array("11", "22", "33", "44"), array("55", "66", "77", "88")));

この $TMP_POST を http_build_query 関数に渡すと、以下のような結果が得られます。

array[0][0]=11&array[0][1]=22&array[0][2]=33&array[0][3]=44&array[1][0]=55&array[1][1]=66&array[1][2]=77&array[1][3]=88
※実際には、ブラケットが URL エンコードされた形で得られます。

この文字列が、POST (GET) 送信した際に PHP が解釈できるクエリ文字列になりますので、<form> タグの name 属性を上記の文字列と同じになるように記述すれば二次元配列を送信することができます。

<form method="post">
    <input name="array[0][]" type="hidden" value="11" />
    <input name="array[0][]" type="hidden" value="22" />
    <input name="array[0][]" type="hidden" value="33" />
    <input name="array[0][]" type="hidden" value="44" />
    <input name="array[1][]" type="hidden" value="55" />
    <input name="array[1][]" type="hidden" value="66" />
    <input name="array[1][]" type="hidden" value="77" />
    <input name="array[1][]" type="hidden" value="88" />
    <input type="submit" />
</form>

上記の方法で POST したものを var_dump[$_POST] した結果は以下の通りです。

array
  ’array’ =>
    array
      0 =>
        array
          0 => string ’11′ length=2
          1 => string ’22′ length=2
          2 => string ’33′ length=2
          3 => string ’44′ length=2
      1 =>
        array
          0 => string ’55′ length=2
          1 => string ’66′ length=2
          2 => string ’77′ length=2
          3 => string ’88′ length=2

echo $_POST['array'][0][0];
を実行すれば、画面上に 11 と表示されます。
また、この記述方法を応用すると、二次元以上の多次元配列や連想配列も POST できるようです。

「二次元配列 POST」等で検索すると本記事が検索上位に来る為、ここにコメントさせていただきましたが、多次元配列の POST に悩んでいる方々の参考になればと思います。

jaco 11-10-12 (水) 15:37

IQ様

ご指摘ありがとうございます。
今読み直すと確かにその通りで、連想配列の中にまた配列が入ってるだけで利便性に劣りますよね・・・。
追記としてその旨記述させて頂きました。どうもありがとうございました

Comment Form
Remember personal info

Trackbacks:2

Trackback URL for this entry
http://jaco.dotstyle.net/2008/02/html%e3%81%aeform%e3%81%8b%e3%82%89%ef%bc%92%e6%ac%a1%e5%85%83%e9%85%8d%e5%88%97%e3%82%92%ef%bd%90%ef%bd%8f%ef%bd%93%ef%bd%94%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/trackback/
Listed below are links to weblogs that reference
HTMLのFORMから2次元配列をPOSTする方法 from JB_Plus
pingback from form から 二次元配列を post する方法 | 空が好きな人のメモ帳 09-03-30 (月) 14:13

[...] form から二次元配列を post できるなんて知らなかったー最悪だ。 JB_Plus » HTMLのFORMから2次元配列をPOSTする方法 POSTの値を配列として受け取ってソースを効率的にしたい。 – 教 [...]

pingback from JB_Plus » HTMLのFORMから2次元配列をPOSTする方法 - baka::blog - Just another WordPress weblog 09-04-29 (水) 3:30

[...] JB_Plus » HTMLのFORMから2次元配列をPOSTする方法 [...]

Search
Feeds
Meta

Return to page top