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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

1849閲覧

検索表をPHPを使って作りたい

ckaposndbbba

総合スコア210

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2015/03/02 11:35

こんにちは。

CSVを読み込んで、検索表を自動生成したいです。

「検索表」とはどういうものか、と言うと、

1:口元に髭がある・・・・・・2へ
1:口元に髭がない・・・・・・3へ
2:頭部は偏平で幅広い・・・・・・ナマズ
2:頭部は偏平でない・・・・・・ドジョウ
3:体は左右に偏平、中央付近が幅広い・・・・・・フナ
3:体は左右に偏平ではない・・・・・・メダカ
(ー wikipediaより)

というふうに、生物などを見分けられるものです。
たとえば、口元に髭があったら、2番へ行きます。
そこで、頭部が偏平でなかったら、ドジョウだと見分けられるわけです。

こういうものを自動生成したいです。

元となるCSVは、

lang

1"ナマズ","口元に髭あり","頭部は偏平" 2"ドジョウ","口元に髭あり","頭部は偏平でない" 3"フナ","口元に髭なし","体は左右に偏平" 4"メダカ","口元に髭なし","体は左右に偏平でない"

といった、それぞれの項目ごとに対応する特徴。

ここから、PHPで、どこが違うかを分析して、上記のような検索表を作りたいです(全く同じものではなくて大丈夫です)。

とりあえず、csvを読み込むのと、違うところを抽出する関数を作ってみましたが。。。

lang

1<?php 2$data = file_get_contents('data.csv'); 3$temp = tmpfile(); 4$csv = array(); 5 6fwrite($temp, $data); 7rewind($temp); 8 9while (($data = fgetcsv($temp, 0, ",")) !== FALSE) { 10 $csv[] = $data; 11} 12fclose($temp); 13 14/* $csvの中身 15 16Array ( 17 [0] => Array ( 18 [0] => ナマズ 19 [1] => 髭あり 20 [2] => 頭は偏平 21 ) 22 [1] => Array ( 23 [0] => ドジョウ 24 [1] => 髭あり 25 [2] => 頭は偏平でない 26 27 ...以下略 28*/ 29 30 31function is_same($a,$b){ 32 if(!is_array($a) || !is_array($b)){ 33 return ""; 34 die(); 35 } 36 $count_a = count($a); 37 $count_b = count($b); 38 if($count_a !== $count_b){ 39 return ""; 40 die(); 41 } 42 43 44 for($i = 1;$i < $count_a;$i++){ 45 if($a[$i] !== $b[$i]){ 46 return $i; 47 break; 48 die(); 49 } 50 } 51}

この先が全く分かりません。また、違うところを抽出する関数も、どこか間違えているかもしれません。

お願いします、困っています!

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

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

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

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

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

guest

回答3

0

ベストアンサー

急ぎで組んだので、結果表示部分がかなり雑ですが、とりあえず動くと思います。

入力データの条件が、「種類が多くて、特徴の項目が多い複雑なもの」ということですが、下のコードでは、とりあえず分岐が必ず2つに分かれるデータを渡しています。
1列目が「結果」、2列目以降が「特徴」で、個数は可変にできると思います。

これを実現するため、再帰処理など、多少複雑なことをしています。
余裕があれば別途で解説も追記したいのですが、いったんこれでよろしくお願いします。

よかったらご自身で改良してみて下さい。
根本的にバグっててどうしようもない、または疑問点等ありましたら、お知らせいただけると幸いです。

lang

1<?php 2 3/* 木構造をつくる */ 4function toTree($answer, $conditions) { 5 $condition = array_shift($conditions); 6 if ($conditions) { 7 return array($condition => toTree($answer, $conditions)); 8 } else { 9 return array($condition => $answer); 10 } 11} 12 13$csv = array( 14 '"結果1","色1","形1","大きさ1","匂い1","価格1"', 15 '"結果2","色2","形2","大きさ2","匂い2","価格2"', 16 '"結果3","色1","形3","大きさ3","匂い3","価格3"', 17 '"結果4","色2","形4","大きさ4","匂い4","価格4"', 18 '"結果5","色1","形1","大きさ5","匂い5","価格5"', 19 '"結果6","色2","形2","大きさ6","匂い6","価格6"', 20 '"結果7","色1","形3","大きさ7","匂い7","価格7"', 21 '"結果8","色2","形4","大きさ8","匂い8","価格8"', 22 '"結果9","色1","形1","大きさ1","匂い9","価格9"', 23 '"結果10","色2","形2","大きさ2","匂い10","価格10"', 24 '"結果11","色1","形3","大きさ3","匂い11","価格11"', 25 '"結果12","色2","形4","大きさ4","匂い12","価格12"', 26 '"結果13","色1","形1","大きさ5","匂い13","価格13"', 27 '"結果14","色2","形2","大きさ6","匂い14","価格14"', 28 '"結果15","色1","形3","大きさ7","匂い15","価格15"', 29 '"結果16","色2","形4","大きさ8","匂い16","価格16"', 30 '"結果17","色1","形1","大きさ1","匂い1","価格17"', 31 '"結果18","色2","形2","大きさ2","匂い2","価格18"', 32 '"結果19","色1","形3","大きさ3","匂い3","価格19"', 33 '"結果20","色2","形4","大きさ4","匂い4","価格20"', 34 '"結果21","色1","形1","大きさ5","匂い5","価格21"', 35 '"結果22","色2","形2","大きさ6","匂い6","価格22"', 36 '"結果23","色1","形3","大きさ7","匂い7","価格23"', 37 '"結果24","色2","形4","大きさ8","匂い8","価格24"', 38 '"結果25","色1","形1","大きさ1","匂い9","価格25"', 39 '"結果26","色2","形2","大きさ2","匂い10","価格26"', 40 '"結果27","色1","形3","大きさ3","匂い11","価格27"', 41 '"結果28","色2","形4","大きさ4","匂い12","価格28"', 42 '"結果29","色1","形1","大きさ5","匂い13","価格29"', 43 '"結果30","色2","形2","大きさ6","匂い14","価格30"', 44 '"結果31","色1","形3","大きさ7","匂い15","価格31"', 45 '"結果32","色2","形4","大きさ8","匂い16","価格32"', 46 ); 47 48$identificationKey = array(); 49foreach ($csv as $line) { 50 $columns = explode(',', $line); 51 list($answer, $conditions) = array(array_shift($columns), $columns); 52 53 $identificationKey = array_merge_recursive($identificationKey, toTree($answer, $conditions)); 54} 55 56 57/* 木構造から結果を表示する */ 58function getResults($conditions, &$bookings, $number) { 59 $results = array(); 60 if ($number < 10) { 61 $number = "0{$number}"; 62 } 63 foreach ($conditions as $condition => $next) { 64 if (is_array($next)) { 65 $nextNumber = array_shift($bookings); 66 $results[] = "{$number}:{$condition}・・・・・・{$nextNumber}へ"; 67 $results = array_merge($results, getResults($next, $bookings, $nextNumber)); 68 } else { 69 $results[] = "{$number}:{$condition}・・・・・・{$next}"; 70 } 71 } 72 asort($results); 73 return $results; 74} 75 76$bookings = range(2, 9999); 77foreach (getResults($identificationKey, $bookings, 1) as $result) { 78 echo "{$result}\n"; 79} 80

投稿2015/03/04 00:19

stg

総合スコア12

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

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

ckaposndbbba

2015/03/04 02:50

おおおおおおおおおおおおおお!!!!!ありがとうございます!!! できました〜! これを参考にしながら、作っていきたいと思います。 勉強になります。。。 ありがとうございましたm(_ _)m
ckaposndbbba

2015/04/06 11:43

こんにちは.度々のコメント失礼します. 実は,バグが1つあって,自分の力で直そうとして試行錯誤したのですが,できませんでした(>_<) 実は,検索が進んでいくと,必要のない項目まですべて出し切っちゃうんですよね. たとえば,以下の様な出力があるのですが, 1. 赤である...4へ 2. 青である..8へ 3. 緑である...15へ 4. つぶつぶがある...5 5. 甘い匂いがする...6 6. 緑のへたがついている...7 7. 若いものは緑色である...いちご ・・・・・・ なんですが,この場合,4〜7は必要ないですよね. 4番で,「いちご」と断定してしまったほうが早いですよね. 説明が分かりにくいかもしれませんが, 改善できませんか? ぼくもいろいろ試して見たのですが,うまくできませんでした. よろしくおねがいします.
guest

0

仕事の依頼なら下記のようなサイトを使うと良いと思いますよ

投稿2015/03/03 10:05

ngyuki

総合スコア4514

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

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

0

CSVは3列で、

"答え","条件1","条件2"

の形式という前提で、このような方法はどうでしょうか。

lang

1<?php 2 3//コードを見た感じ、{$csv}にはこんなデータが入っていそうなので、これを使って実装します。 4$csv = array( 5 '"ナマズ","口元に髭あり","頭部は偏平"', 6 '"ドジョウ","口元に髭あり","頭部は偏平でない"', 7 '"フナ","口元に髭なし","体は左右に偏平"', 8 '"メダカ","口元に髭なし","体は左右に偏平でない"', 9 ); 10 11/* 12 * 多重連想配列で、検索表の木構造を表現します。 13 * 今回の入力に対して、 14 * [ 15 * '"口元に髭あり"' => ['"頭部は偏平"' => '"ナマズ"', '"頭部は偏平でない"' => '"ドジョウ"'], 16 * '"口元に髭なし"' => ['"体は左右に偏平"' => , '"フナ"', '"体は左右に偏平でない"' => '"メダカ"'] 17 * ] 18 * が構築されるはずです。 19 */ 20$identificationKey = array(); 21 22foreach ($csv as $line) { 23 list($answer, $condition1, $condition2) = explode(',', $line);//"答え","条件1","条件2"に分解 24 25 if (isset($identificationKey[$condition1])) { 26 $identificationKey[$condition1][$condition2] = $answer; 27 } else { 28 $identificationKey[$condition1] = array($condition2 => $answer); 29 } 30} 31 32// 構築した木構造から、検索表の各文言を表示します。 33$results = array(); 34 35$conditionNumber = 1; 36foreach ($identificationKey as $condition1 => $answers) { 37 $conditionNumber++; 38 $results[] = "1:{$condition1}・・・{$conditionNumber}へ"; 39 foreach ($answers as $condition2 => $answer) { 40 $results[] = "${conditionNumber}:{$condition2}・・・{$answer}"; 41 } 42} 43asort($results);//並び替え 44 45foreach ($results as $result) { 46 echo "{$result}\n"; 47}

投稿2015/03/02 16:32

stg

総合スコア12

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

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

ckaposndbbba

2015/03/03 03:49

詳しく教えていただき、ありがとうございます! 早速、そのコードで試してみました。 すると、きれい〜に表示されました! しかし。。。 たとえば、 "結果","特徴1","特徴2","特徴3","特徴4","特徴5" "結果2","特徴1","特徴2","特徴3","特徴4","特徴5" "結果3","特徴1","特徴2","特徴3","特徴4","特徴5" "結果4","特徴1","特徴2","特徴3","特徴4","特徴5" "結果5","特徴1","特徴2","特徴3","特徴4","特徴5" "結果6","特徴1","特徴2","特徴3","特徴4","特徴5" みたいな、種類が多くて、特徴の項目が多い複雑なものでは、うまくいきません。 コードを見て、直そうとしてみましたが、なおさら変になりました。。。。 複雑なcsvでも、読み取りたいです。。。 素人ですみません、 可能でしょうか。。? よろしくお願いしますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問