• ベストアンサー

CSVファイル一覧の際、ファイルのデータで異なる画

CSVファイルがあります。 1行目 北海道,HOKKAIDO,2 2行目 東北,TOHOKU,1 3行目 以下いろいろと続く 上記のようなCSVファイルがあり、HTMLでTABLEタグを使用してTRごとファイルの1行分を展開して全部を表示させたいのです。 ただ、末尾のデータが1の場合は一階層下のimgディレクトリにあるAの画像を表示し、2の場合は同様にBの画像を表示させ、それぞれALT属性で北海道や東北のようにCSVの最初のデータを入れたいのですがやり方が分かりません。 ちなみに末尾のデータは1か2のみです。 ご教示いただければ幸いです。

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

  • ベストアンサー
noname#244856
noname#244856
回答No.3

ASCIIコードの並び、具体的には A → 65 B → 66 であることを利用するとシンプルに書けますねww setlocale(LC_ALL, 'ja_JP.UTF-8'); if ($fp = fopen('data.csv', 'rb')) {  echo '<table>' . PHP_EOL;  while ($row = fgetcsv($fp)) {   if (count($row < 3)) {    continue;   }   echo '<tr>' . PHP_EOL;   echo '<td>' . $row[0] . '</td>' . PHP_EOL;   echo '<td>' . $row[1] . '</td>' . PHP_EOL;   printf(    '<td><img src="img/%s.jpg" alt="%s"></td>' . PHP_EOL,    chr(64 + $row[2]),    $row[0]   );  }  echo '</table>' . PHP_EOL; } ・OKWave上でコードが読みやすいように全角スペースでインデントしています。 ・出力されるHTMLコードが読みやすいように適当にタグの末尾で改行しています。 ・CSVファイルの文字化け問題に配慮しています。 Pentan.info - fgetcsv関数を文字化け対応 setlocaleの文字コード指定 http://pentan.info/php/fgetcsv_char.html <img>とするか<img />とするかについては、自分がHTMLを書いているのかXHTMLを書いているのかを考慮してどちらかに統一させてください。

その他の回答 (3)

noname#244856
noname#244856
回答No.4

ごめんなさい、printfの後にtrの閉じタグ入れ忘れました… あと…入力データにHTMLタグなどが含まれる可能性がある場合、htmlspecialchars関数を通してからechoしなければいけません。 PHP Manual - htmlspecialchars http://www.php.net/manual/ja/function.htmlspecialchars.php 毎回この関数を書くのは面倒なので、 function h($str) {  return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } として1文字で呼べる関数を用意しておくと非常に便利です。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

>末尾のデータが1の場合は一階層下のimgディレクトリにある >Aの画像を表示し、2の場合は同様にBの画像を表示させ、 >それぞれALT属性で北海道や東北のようにCSVの最初の >データを入れたい Aの画像とかBの画像というのは、どこで決まるのでしょうか?1, 2, 3・・に従って、A, B, C なのでしょうか(それにしても拡張子もわからないし)。 (わからないので)ソースに直接書くならこんな感じですかね。 while ($row = fgetcsv($fp)) { if (count($row) < 3) { continue; } echo '<tr>'; echo '<td>' . $row[0] . '</td>'; echo '<td>' . $row[1] . '</td>'; $sw = intval($row[2]); switch $sw { case 1: echo '<td><img src="img/A.jpg" alt="' . $row[0] . '" /></td>'; break; case 2: echo '<td><img src="img/B.jpg" alt="' . $row[0] . '" /></td>'; break; default: echo '<td></td>'; } echo '</tr>'; } 値と画像名の関連付けは配列で保持しておいた方がいいとは思いますけどねww

kaitom
質問者

お礼

参考にさせていただきます。ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ざっとこんなフローでよいのでは? ただしCSVの文字コードとphpファイルの文字コードを合わせないと うまくいかないかもしれません <?PHP print "<table border=1>\n"; print "<tbody>\n"; if (($handle = fopen("test.csv", "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { print "<tr>\n"; foreach($data as $key=>$val){ if($key==2){ $alt=htmlspecialchars($data[0]); $src=($val==1)?"img/a.jpg":"img/b.jpg"; $txt="<img src=\"{$src}\" alt=\"{$alt}\">"; }else{ $txt=htmlspecialchars($val); } print "<td>{$txt}</td>\n"; //print "<td>".htmlspecialchars($txt)."</td>\n";//チェック用 } print "</tr>\n"; } fclose($handle); } print "</tbody>\n"; print "</table>\n";

kaitom
質問者

お礼

ありがとうございました。 参考にさせていただきます。

関連するQ&A