• ベストアンサー

複数のデータを選択し結果をcsvに保存し処理

現在複数のデータを選び、その結果をcsvで保存することを考えています。 例えば 好きな国を選んで、コメントを書いてください。 アメリカ イギリス フランス スペイン ポルトガル ブルガリア ・ ・ ・ と100ヶ国表示します。チェックボックスで好きな国を任意の数だけ選びそれをcsvに保存したと仮定します。 data.csv ============= ユーザー名,好きな国,コメント ユーザA,アメリカ,イギリス,スペイン,行きました。 ユーザB,アメリカ,ブルガリア,イギリス,ポルトガル,好きです。 ユーザC,イギリス,コメントです。 ========================= これを読み出す場合、列が沢山あるため $Data = file("data.csv"); for($i=0;$i<sizeof($Data);$i++){ $line = explode(",",$Data[$i]); =====ここの処理がわかりません。=== list($u_name, $kuni, $kuni, $kuni, $kuni, $kuni, $kuni, ・・・・・・・$com = $line; if($u_name = $_GET['u_name']) echo "$u_nameの好きな国リスト<P>"; echo " $kuni<BR>"; } } とlistで変数に配分することができません。 このようなユーザーが何件登録するかわからない場合のCSVの処理はどのようにすればよろしいのでしょうか? ユーザーの名前を利用してu_name.txtを作成し中にデータを書き込んだほうが良いのでしょうか? このような複数選択されて何件登録されるかわからない(フィールドが何列になるかわからない)データの保存、処理はどのように行うのが定石なのでしょうか? 恐縮ですがお力をお貸し頂ければ幸いです。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>とlistで変数に配分することができません。 $line[index]と別の変数に配分しなくても、そのまま配列で扱えばいいと思います。 >(フィールドが何列になるかわからない)データの保存 データベースなんかの場合は 名前, 国, コメント のようなレコードを国の数だけ登録するというような感じになると思います。 そういう使い方でないなら、まとめてそのまま保存しておいて、取り出した時にやはりexplode で分割するというような形になるのじゃないかと思います。

yun100
質問者

補足

お忙しい中、ご返信を下さり本当にありがとうございます。 私自身の知識不足から恐縮ではありますが質問させていただきます。 >$line[index]と別の変数に配分しなくても、そのまま配列で扱えばいいと思います。 この場合はCSVを書き換えて ============= ユーザー名,コメント,好きな国 ユーザA,行きました。,アメリカ,イギリス,スペイン ユーザB,好きです。,アメリカ,ブルガリア,イギリス,ポルトガル ユーザC,コメントです。,イギリス ========================= <?PHP $Data = file("data.csv"); for($i=0;$i<sizeof($Data);$i++){ $line = explode(",",$Data[$i]); if($line[0] == "ユーザC"){ $count = count($line); echo "$line[0]の好きな国リスト<P>"; for($i=2;$i<$count;$i++){ echo " 好きな国:$line[$i]<BR>"; } echo "コメント:$line[1]"; } } ?> とすることで、確かにやりたいことは出来たのですが 少し腑に落ちない所というかよく理解できない考え方があります。 まず、CSVを書き換えなければいけない事 (これはプログラムの仕様と考えれば仕方のないことなのかもしれません。) そして、アンケートのような場合 質問1.好きな果物を何個でも書いてください。 質問2.好きな飲み物を自由に書いてください。 といった場合、上記のプログラムでは 実現できない事 >データベースなんかの場合は >名前, 国, コメント >のようなレコードを国の数だけ登録するというような感じになると思います。 ようやくMysqlをちょっと理解できるようになった程度でこのような質問は 本当に恐縮ですが >レコードを国の数だけ登録するというような感じ ということは上記のようなCSVをMYSQLで実現させる場合 テーブルを2つ作って 1つ目にはユーザー名とコメントを 2つ目にはそのユーザー名のテーブルを用意して そこにレコード(行)として登録するイメージでよろしいのでしょうか?

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#1>CSVを書き換えなければいけない事 #1>$count = count($line); の様にして、いくつのデータがあるのか調べていますよね。 だったら、並び替えなくても、 最初のデータが名前で、最後のデータがコメントだとわかると思います。 #1>1つ目にはユーザー名とコメントを #1>2つ目にはそのユーザー名(と国)のテーブルを用意して #1>そこにレコード(行)として登録するイメージでよろしいのでしょうか? それでいいと思います。

yun100
質問者

お礼

>$count = count($line);の様にして、いくつのデータがあるのか調べていますよね。 >だったら、並び替えなくても、最初のデータが名前で、最後のデータがコメントだとわかると思います。 恥ずかしながらBLUEPIXY様のご指摘でようやく気づきました。確かに配列の数を数えているのだからその取得した数が配列の最後のindexになるわけですね。 sqlのご指摘も大変参考になりました。 長々とご質問にお付き合いいただき本当にありがとうございます。 そして本当にお手数をおかけしました。

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.2

data.csv ============= "ユーザー名","好きな国","コメント" "ユーザA","アメリカ,イギリス,スペイン","行きました。" "ユーザB","アメリカ,ブルガリア,イギリス,ポルトガル","好きです。" "ユーザC","イギリス","コメントです。" =========================

関連するQ&A