• ベストアンサー

複数選択の項目をPHP側でArrayで受け取る方法。

PHPで開発の際、HTMLのフォームで複数選択の項目を、PHP側でArrayで受け取る際、フォームの項目のnameを、例えば、<input type="checkbox" name="hoge[]"> のように [] を入れないとダメなんですか? 以前、Perlをやっていまして、ちょっとショッキングです。他にも方法はありますか?もしあるなら、一番標準てきな方法はどういった方法でしょう。 [] と書くと、その項目が単数か複数かという情報をHTML側に依存させてしまう印象を受けます。 (どちらにせよ、checkboxやradioと書いている時点で、単数複数の情報をもたせてしまってますが・・・)

質問者が選んだベストアンサー

  • ベストアンサー
  • wp_
  • ベストアンサー率54% (132/242)
回答No.2

>PHPで開発の際(snip) [] を入れないとダメなんですか? ダメ、と言うことはありません。 「name属性に[]をつけると配列で渡る」というのがPHPの仕様です。 >以前、Perlをやっていまして、(snip)一番標準てきな方法はどういった方法でしょう。 「PHPでは」name属性をname="hoge[]"とするのが一般的ですね。 phpで構成されている商用サイトのソースを覗いてみると良いかもしれません。 >[] と書くと、その項目が単数か複数かという情報をHTML側に依存させてしまう印象を受けます。 逆に考えると、MVCの精神からすれば送信パラメータはHTMLに依存させた方が都合が良いのですよ。 見た目が分かりやすくなるとか、資料を作りやすいとか。 ロジカルな問題で配列に渡した方が都合よい場合もあります。 <form action="送信先" method="POST"> <input type="radio" name="test[]" value="hoge" checked /> <input type="text" name="test[]" value="nyo-n" /> <textarea name="test[]"></textarea> <input type="submit" value="go" /> </form> これを受け取ると [test] => Array (  [0] => hoge  [1] => nyo-n  [2] => (テキストエリアで送った値) ) こうなります。

sweepea
質問者

お礼

ありがとうございます。 [] ←これは、snipというのですか? 記号はググれないので、調べるのが大変で・・・。 > phpで構成されている商用サイトのソースを覗いてみると良いかもしれません。 あ、本当ですね。このQ&Aサイトの関心カテゴリー(複数登録可)を見てみると、name="u_ct[]" になってました。 > MVCの精神からすれば・・・ ということは、CakeやSymphonyといったメジャーなフレームワークもそうなんでしょうか? 僕が驚いたのは、[]とすることで、PHPで書かれているということがバレるということよりも、開発言語によってHTMLへの出力が変わってしまうということにあります。 でも、みんな便利だというので、便利であれば何も問題ないのですが・・・。

その他の回答 (2)

  • wp_
  • ベストアンサー率54% (132/242)
回答No.3

>[] ←これは、snipというのですか? snipは(略)の意味ですよ^^; []は普通に「角括弧」と読みます。 http://jp.php.net/manual/ja/language.types.array.php >ということは、CakeやSymphonyといったメジャーなフレームワークもそうなんでしょうか? Cake,Symphonyのソースを見たことがないので確固としたことは分かりませんが、おそらくそうなのではないかと推測します。 ただ、フレームワークの場合は添え字を明示的に指定したりnameそのものをcontrollerに依存させている場合もあるので一概には言えません。 >僕が驚いたのは、(snip)開発言語によってHTMLへの出力が変わってしまうということにあります。 そのへんは「CGIとして動作」と「apacheのmoduleとして動作」の差異なので、同列として考えること自体がナンセンスだったりします。 HTMLはシステムに合わせて設計されるべきであり、システムが(サーバ・クライアントどちらでも)変われば構築されるべきHTMLも変化するのが当然なのです。 //最たる例が携帯などのモバイル系ですね。 まぁ作成者側から見れば使いまわせる方が助かるは助かるのですが^^; perl→phpの移行を何も知らないお偉いさんが勝手に決定して泣くのは末端ですからねぇ・・・

sweepea
質問者

お礼

> snipは(略)の意味ですよ^^; おぉ。お恥ずかしい。今、alcで調べました。 > ただ、フレームワークの場合は添え字を明示的に・・・ どこかで、 <input type="checkbox" name="data[hoge][fuga]"> みたいなのを見ました。うーん、便利かもですね。 > そのへんは「CGIとして動作」と「apacheのmoduleとして動作」の差異なので・・・ その通りですね。もう、[]に慣れちゃいました。(笑) ありがとうございました。

回答No.1

一番基本的なものは name="hoge[]"なんて方式だと思います。 単純にPHPの$_POSTなどで予め配列として取得されるためですね。 <input type="checkbox" name="a"> <input type="checkbox" name="a"> <input type="checkbox" name="a"> <input type="checkbox" name="a"> こんな風にした場合、PHPだと少し工夫をする必要があります。 perlと同じようにQUERY_STRINGやSTDINから値を取得して、foreachなどで配列を取得する必要があります。 単数か複数かは最後に書かれているようにHTML側ですでに決まる物だと思います。 name="hoge[]"で支障が無いのであればそちらの方が簡単でいいと思いますよ。

参考URL:
http://www.php.net/manual/ja/wrappers.php.php
sweepea
質問者

お礼

> 一番基本的なものは name="hoge[]"なんて方式だと思います。 なるほど了解しました。 > perlと同じようにQUERY_STRINGやSTDINから値を取得して、foreachなどで配列を取得する必要があります。 それは面倒ですね。わざわざそうする理由も浮かばないですね。 (Perlでは、CGI.pmを使用していたので、そのような処理をしていたのは遠い昔のことです。) > name="hoge[]"で支障が無いのであればそちらの方が簡単でいいと思いますよ。 確かに。これは、素直に「便利だなぁ」と思っておいたほうがいいのかもしれません。

関連するQ&A