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

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

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

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

PHP

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

Q&A

解決済

1回答

4411閲覧

csvデータを検索して表示したい

2525mi

総合スコア8

CSV

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

PHP

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

1グッド

1クリップ

投稿2020/01/03 01:46

編集2020/01/03 05:55

csvデータに

りんご,100,青森,赤,
みかん,50,和歌山,オレンジ,
りんご,90,福島,赤

のように入っています。例えばプルダウンメニューで「りんご」と選択した時に、「りんご,100,青森,赤」「りんご,90,福島,赤」というように表示させたいです。

PHP

1 2$row = 1; 3if (($handle = fopen("data.csv", "r")) !== FALSE) { 4 while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 5 if(array_search('/りんご/', $data) !== 0){ 6 $num = count($data); 7 echo "<p> $num fields in line $row: <br /></p>\n"; 8 $row++; 9 for ($c=0; $c < $num; $c++) { 10 echo $data[$c] . "<br />\n"; 11 } 12 }} 13 fclose($handle); 14}

上記のコードですと、すべてのデータが出てきてしまいます。修正していただけますと幸いです。

DrqYuto👍を押しています

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

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

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

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

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

m.ts10806

2020/01/03 02:28

$dataが配列で取得されてるというのは認識されてますか?
m.ts10806

2020/01/03 02:28

あとループさせてないので一行しか出ないような
2525mi

2020/01/03 02:33

コメントありがとうございます。他の関数を見つけたため、一度編集をしてコードを書き換えたのですが現在のコードに対するコメントということでよろしいでしょうか? ややこしくしてしまい申し訳ありません。一応そのように認識しています。
退会済みユーザー

退会済みユーザー

2020/01/03 03:47

いまのでも1行しか処理してませんね
2525mi

2020/01/03 04:13

お二方ご指摘ありがとうございます。for文を追加してみました。ここからさらにint(0)やbool(false)ではなくヒットした中身を表示させたいのですが、どうすればよいでしょうか。
退会済みユーザー

退会済みユーザー

2020/01/03 04:16

いやww fgetcsv 自体が 1行分のCSV要素を返却するのだよ よってループ内にないので1行分しか処理をしない。 記載されてるループは1行内の各項目をチェックしている
2525mi

2020/01/03 04:28

失念しておりました。それでは、fgetcsvをやめて別の関数を使った方がいいということでしょうか?
m.ts10806

2020/01/03 05:18

fgetcsvの使い方を間違っている段階で他の手を探すのはおかしいと思います。 私が提示したPHPマニュアルの組み方はやってみられましたか?
2525mi

2020/01/03 05:58

仰る通りです。リンク先を読み、検索用に自分なりにコードを書き換えてみました。しかし、元のコードをそのまま入力した時と同様に全てのデータが出てしまいます。検索に引っかかった行のみを表示させるにはどうしたらよいでしょうか?
m.ts10806

2020/01/03 06:09

要件をもっと詰めたいのですが、これって検索先のフィールドはきまってないんですか?どれかが該当すればOK?それとも特定のフィールド? あとフィールドに対して、部分一致、前方一致、後方一致、完全一致、 どれでしょう。
2525mi

2020/01/03 06:35

ご返信ありがとうございます。どれかが該当すればOK、部分一致を想定しております。
m.ts10806

2020/01/03 07:10

csv、phpのファイル自体の文字コードは何でしょうか。 同じでない場合は全角文字扱ってるので文字コードの変換が必要かと思いますが 提示のコードはどこにも変換が入ってないので
2525mi

2020/01/03 07:25

文字コードの変換をすることを失念しておりました。ありがとうございます。csv、phpのファイルの文字コードはutf-8になります。
m.ts10806

2020/01/03 07:26

両方UTF8であれば変換は不要です。
guest

回答1

0

ベストアンサー

まずは出来るやり方で。

php

1<?php 2$search_word = 'りんご'; 3if (($handle = fopen("data.csv", "r")) !== FALSE) { 4 while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 5 $flg = false; 6 $crow = []; 7 foreach ($data as $c) { 8 $crow[] = $c; 9 if (strpos($c, $search_word) !== false) { 10 $flg = true; 11 } 12 } 13 if ($flg) { 14 var_dump($crow); 15 } 16 } 17 fclose($handle); 18}

あと、array_search()は完全一致らしいので部分一致では使えなくなります。
別の配列検索でpreg_grep()を使うと同じ結果でも短く書けそうです。

php

1<?php 2$search_word = 'りんご'; 3if (($handle = fopen("data.csv", "r")) !== FALSE) { 4 while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 5 if(count(preg_grep('/'.$search_word.'/', $data)) > 0){ 6 var_dump($data); 7 } 8 } 9 fclose($handle); 10}

投稿2020/01/03 07:39

m.ts10806

総合スコア80850

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

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

2525mi

2020/01/03 08:58

助かりました。ありがとうございます。
m.ts10806

2020/01/03 09:10

課題代行や作業依頼に応えたつもりはないので、 「どのように理解できたか」フィードバックいただけるとそのコメントも今後同じような問題を抱えた誰かのためになりますので。 https://teratail.com/help/question-tips#questionTips4-2
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問