- ベストアンサー
csvの特定のキーワードを指定して、そのキーワードを含む行を表示させる方法
こんにちは。いつも参考にさせてもらっています。 さて、下記のコードはcsvのデータをphpにて読み込み、各項目ごとに分割をして、指定した行のみをtableに表示させているのですが、実際は行を指定するのではなく、特定のキーワードを指定し、その指定したキーワードの行をtable上に表示させたいのです。 自分なりに調べてみたのですが、うまくいかない理由がわからなかったので今回投稿させて頂きました。 よろしくお願い致します。 <?php $openfile = file_get_contents('sq-tyo.csv'); $csv_gyo = split("\n", $openfile); echo "<div>"; list($from, $class, $to, $type1, $type2, $kikan) = split(",", $csv_gyo[0]);//1行目 echo "<table>"; echo "<tr>"; echo "<td>"; echo "<b>出発地</b>"; echo "</td>"; echo "<td>".$from."</td>"; echo "<td>"; echo "<b>座席クラス</b>"; echo "</td>"; echo "<td>".$class."</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<b>目的地</b>"; echo "</td>"; echo "<td>".$to."</td>"; echo "<td>"; echo "<b>種類</b>"; echo "</td>"; echo "<td>".$type1."</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<b>経路</b>"; echo "</td>"; echo "<td>".$type2."</td>"; echo "<td>"; echo "<b>期間</b>"; echo "</td>"; echo "<td>".$kikan."</td>"; echo "</tr>"; echo "</table>"; ?> 本当はデータベースを使用したいのですが、今回はcsv使用のみと言われてしまったので、ご協力をお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
なるほどです となると、やはりtany180sxさんのやり方になります //キーワードを取得 $keyword = $_GET['keyword']; //先にテーブルのヘッダー行を書き出します //省略 //ここから検索&該当行の書き出し foreach ($csv_gyo as $key => $val) { //ここでmb_strpos関数でCSVの行を検索しています if (mb_strpos($val, $keyword) === false) { continue;//キーワードが見つからない場合はループをひとつ飛ばして次の行へ } //キーワードが見つかった場合のみ以下のコードが実行されます list($from, $class, $to, $type1, $type2, $kikan) = split(",", $val); //ここにテーブルを書き出すコードを書きます echo '<tr>'; //省略 echo '</tr>'; } //テーブルを閉じます echo '</table>'; 検索のところは CSV行のなかに$keywordがあるかどうかをチェックするだけです 検索方法は正規表現を使用するなど、いくつか方法はあります。 "php 文字列 検索" 等で検索すればやり方がいくつか見つかると思います。 上記のコードでうまく検索できない場合は、 日本語を含んでいますのでPHPの文字コードとCSVの文字コードが異なっている 可能性が考えられます。 その場合は、文字コードを統一するか 検索時にキーワードとCSV行の文字コードをmb_convert_encodingで合わせるとか…
その他の回答 (2)
- mr_araki
- ベストアンサー率85% (12/14)
はじめまして 基本的にはtany180sxさんのやり方で大丈夫だと思いますよ それかもしかして指定行ではなくて指定列のことですか? たとえば期間を指定されたら期間だけを表示みたいな?? 同じようなことを実現しているサイト等があれば、非常に参考になります。
補足
こちらこそはじめまして。ご回答ありがとうございます。 tany180sxさんの方法を参考に書下記コードを作ってみましたが、指定したキーワードのみの行だけでなく、csvの中にあるすべての行が表示されてしまいました。 <?php $openfile = file_get_contents('sq-tyo.csv'); $csv_gyo = split("\n", $openfile); $keyword = 'TGおすすめ'; foreach ($csv_gyo as $key => $val) { list($from, $class, $to, $type1, $type2, $kikan) = split(",", $val); echo "<table>"; echo "<tr>"; echo "<td>"; echo "<b>出発地</b>"; echo "</td>"; echo "<td>".$from."</td>"; echo "<td>"; echo "<b>座席クラス</b>"; echo "</td>"; echo "<td>".$class."</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<b>目的地</b>"; echo "</td>"; echo "<td>".$to."</td>"; echo "<td>"; echo "<b>種類</b>"; echo "</td>"; echo "<td>".$type1."</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<b>経路</b>"; echo "</td>"; echo "<td>".$type2."</td>"; echo "<td>"; echo "<b>期間</b>"; echo "</td>"; echo "<td>".$kikan."</td>"; echo "</tr>"; echo "</table>"; } ?> csvは下記のような感じです↓ ,東京,エコノミー,ソウル,FIX,往復,2-14日間 TGおすすめ,東京,エコノミー,バンコク,FIX,往復,2-6日間 ,東京,エコノミー,上海,FIX,往復,2-10日間 上記1列目にある「TGおすすめ」の行以外はhtmlに表示させたくないようにしたいのです。 初心者的な質問で大変申し訳ありませんが、ご教授いただけますようよろしくお願いいたします。
- tany180sx
- ベストアンサー率63% (239/379)
> うまくいかない理由がわからなかったので ループが分からないのでしょうか?検索? $keyword = 'hoge'; foreach ($csv_gyo as $key => $val) { if (mb_strpos($val, $keyword) === false) { continue; } list($from, $class, $to, $type1, $type2, $kikan) = split(",", $val); echo '<table>'; echo '</table>'; } PS.ご自分で作成されたシンプルなCSVならこのsplitで大丈夫ですが Excel等で作成されたものなら不具合が生じます。
お礼
教えてくださったコードで見事解決いたしました。ありがとうございました。
補足
ご回答ありがとうございます >ループが分からないのでしょうか?検索? 行数指定でやると、後からもし行が足された時につじつまが合わなくなってしまうので、それを避けるための方法を考えています。 上記だと行を行数指定で認識させてテーブルにはきだしているのですが、私がやりたいのは、ある特定の1つのキーワードを指定して、そのキーワードのある行すべてをテーブルに表示させたいのですが、その方法がよく分からないのです。。。。
お礼
mr_arakiさま ご丁寧なご回答ありがとうございます。 おかげで無事解決いたしました。 まだまだ勉強しないことが多いと、改めて思わさせられました。 今回はどうもありがとうございました。