質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

8004閲覧

繰り返しのフォーム要素のスマートな処理方法

msx2

総合スコア174

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/09/02 03:48

下記の内容が含まれるフォームから送信されてくるデータを処理しようとしています。
これ以外にもたくさんのデータが送信されてきます。

html

1 <table> 2 <tr> 3 <td>カテゴリ</td><td>商品番号</td><td>商品名</td><td>表示順</td> 4 </tr> 5 <tr> 6 <td><input type="text" value="c1" name="c1"></td> 7 <td><input type="text" value="1001" name="id_c1_1001"></td> 8 <td><input type="text" value="AAA" name="name_c1_1001"></td> 9 <td><input type="text" value="1" name="order_c1_1001"></td> 10 </tr> 11 <tr> 12 <td></td> 13 <td><input type="text" value="1002" name="id_c1_1002"></td> 14 <td><input type="text" value="BBB" name="name_c1_1002"></td> 15 <td><input type="text" value="2" name="order_c1_1002"></td> 16 </tr> 17 <tr> 18 <td></td> 19 <td><input type="text" value="1003" name="id_c1_1003"></td> 20 <td><input type="text" value="CCC" name="name_c1_1003"></td> 21 <td><input type="text" value="4" name="order_c1_1003"></td> 22 </tr> 23 <tr> 24 <td><input type="text" value="c2" name="c2"></td> 25 <td><input type="text" value="2011" name="id_c2_2011"></td> 26 <td><input type="text" value="DDD" name="name_c2_2011"></td> 27 <td><input type="text" value="10" name="order_c2_2011"></td> 28 </tr> 29 <tr> 30 <td></td> 31 <td><input type="text" value="2005" name="id_c2_2005"></td> 32 <td><input type="text" value="EEE" name="name_c2_2005"></td> 33 <td><input type="text" value="9" name="order_c2_2005"></td> 34 </tr> 35 </table>

postされたデータから上記のデータを読むための配列データがあるので、この配列をループさせながらキーを作成してpostデータを読み取っています。

php

1//こういう配列があります 2$arr = array( 3 array( 4 'category_id' => 'c1', 5 'item_data' => array( 6 array('id' => '1001'), 7 array('id' => '1002'), 8 array('id' => '1003') 9 ) 10 ), 11 array( 12 'category_id' => 'c2', 13 'item_data' => array( 14 array('id' => '2011'), 15 array('id' => '2005') 16 ) 17 ) 18); 19 20//送信データは配列をループしてキーを作成して取得している 21foreach($arr as $val){ 22 $category_id = $val['category_id']; 23 foreach($val['item_data'] as $item){ 24 $id = $item['id']; 25 //postデータの取得(して何かしら処理します) 26 $_post['id_'.$category_id.'_'.$id]; 27 $_post['name_'.$category_id.'_'.$id]; 28 $_post['order_'.$category_id.'_'.$id]; 29 } 30}

このプログラムは自分で考えて作りました。
プログラムは期待通りに動いているので問題が発生している訳ではありませんが、もう少しスマートな書き方がないものかと思い質問させていただきました。

基本的にはフォームに表示されている入力項目はどれだけ数が多くなったとしてもプログラムで把握しているので受け取る側で送信されてくるであろう値を処理しています。
ただし、送信されるデータが可変になった場合にデータを送信された数だけ処理しようとすると今回の様な方法が成り立たず、postデータを全件取得しキーを解析するなどの手間がかかります。

HTMLフォームから送信するデータに意味を持たせてグループ化する方法なんてものはないでしょうか?

上記の例で<table>は1つのまとまりになり、カテゴリーでグループ化され、その中に商品データが複数入っています。
PHPのプログラムだとこういう構造がわかっていれば件数関係なくループをして全件取得できますが、私の知識ではフォームから送信されるデータにはキー名を付けて識別することしかできず、もっとスマートな方法があれば今後のプログラムに役立ていこうと思っています。

経験豊富なエンジニアの皆様、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

HTMLフォームから送信するデータに意味を持たせてグループ化する方法なんてものはないでしょうか?

input要素のname属性には次のような値を指定することもできます。

<input type="text" name="c1[id]" value="1001" />

PHP側では、上記の値を次のように取り扱うことができます。

$_POST['c1']['id'];

投稿2016/09/02 03:56

enctype

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msx2

2016/09/02 04:07

素早い回答ありがとうございます!! 配列として扱えればforeachで処理できますね^^
guest

0

まあこうだな

html

1<table> 2 <tr> 3 <td>カテゴリ</td><td>商品番号</td><td>商品名</td><td>表示順</td> 4 </tr> 5 <tr> 6 <td><input type="text" value="c1" name="c1[1001]" ></td> 7 <td><input type="text" value="1001" name="id[1001]" ></td> 8 <td><input type="text" value="AAA" name="name[1001]" ></td> 9 <td><input type="text" value="1" name="order[1001]"></td> 10 </tr> 11</table>

マニュアルのサンプル

亜種で

html

1<table> 2 <tr> 3 <td>カテゴリ</td><td>商品番号</td><td>商品名</td><td>表示順</td> 4 </tr> 5 <tr> 6 <td><input type="text" value="c1" name="row[1001][c1]" ></td> 7 <td><input type="text" value="1001" name="row[1001][id]" ></td> 8 <td><input type="text" value="AAA" name="row[1001][name]" ></td> 9 <td><input type="text" value="1" name="row[1001][order]"></td> 10 </tr> 11</table>

投稿2016/09/02 03:54

編集2016/09/02 03:56
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msx2

2016/09/02 04:05

素早い回答ありがとうございます!! フォームの送信データって配列にできるんですね!! 亜種がよさそう(^^
guest

0

ベストアンサー

今回のデータ構造だったらこうじゃないでしょうか?

HTML

1<form> 2<input type="submit" value="go"> 3<table> 4 <tr> 5 <td>カテゴリ</td><td>商品番号</td><td>商品名</td><td>表示順</td> 6 </tr> 7 <tr> 8 <td><input type="text" value="c1" name="arr[0][category]" ></td> 9 <td><input type="text" value="1001" name="arr[0][itemdata][0][id]" ></td> 10 <td><input type="text" value="AAA" name="arr[0][itemdata][0][nam]" ></td> 11 <td><input type="text" value="1" name="arr[0][itemdata][0][order]"></td> 12 </tr> 13 <tr> 14 <td></td> 15 <td><input type="text" value="1002" name=arr[0][itemdata][1][id]" ></td> 16 <td><input type="text" value="BBB" name=arr[0][itemdata][1][nam]" ></td> 17 <td><input type="text" value="2" name=arr[0][itemdata][1][order]"></td> 18 </tr> 19 <tr> 20 <td></td> 21 <td><input type="text" value="1003" name=arr[0][itemdata][2][id]" ></td> 22 <td><input type="text" value="CCC" name=arr[0][itemdata][2][nam]" ></td> 23 <td><input type="text" value="4" name=arr[0][itemdata][2][order]"></td> 24 </tr> 25 <tr> 26 <td><input type="text" value="c2" name="arr[1][category]" ></td> 27 <td><input type="text" value="2011" name="arr[1][itemdata][0][id]" ></td> 28 <td><input type="text" value="DDD" name="arr[1][itemdata][0][nam]" ></td> 29 <td><input type="text" value="10" name="arr[1][itemdata][0][order]"></td> 30 </tr> 31 <tr> 32 <td></td> 33 <td><input type="text" value="2005" name="arr[1][itemdata][1][id]" ></td> 34 <td><input type="text" value="EEE" name="arr[1][itemdata][1][nam]" ></td> 35 <td><input type="text" value="9" name="arr[1][itemdata][1][order]"></td> 36 </tr> 37</table> 38</form> 39<?PHP 40print_r($_GET); 41?> 42

投稿2016/09/02 05:11

yambejp

総合スコア114581

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msx2

2016/09/02 06:46

ご回答ありがとうございます。 確かに今回の構造だとこうなりますね、私も自分で作ったら同じになりました。 フォームで要素を配列にするテクニックって一般的なのでしょうか???
yambejp

2016/09/02 07:04

もともとWEBに親和性が高い仕様なのでPHPにかぎって言えば非常に一般的ですね よくあるのは <input type="checkbox" name="c[]" value="1"> <input type="checkbox" name="c[]" value="2"> <input type="checkbox" name="c[]" value="3"> のように、同じ名称のチェックボックスを作っておいて受け側で任意の配列として利用します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問