• 締切済み

PHPのCSVファイル読み込みについて

現在、PHPでCSVファイルを読み込み、広告をランキングしてランダムで出力しています。 今後例えばCSVファイルの中に10行の広告があるとしたら、5行をランダムで出力したいのですが、方法がわかりません。 現在はCSVファイルの中に5行広告があり、出力している広告も5行です。 ソースはこちらになります。 <? $h = file_get_contents("http://ドメイン/csv/koukoku.csv"); $h = trim($h); $h = explode("\n",$h); shuffle($h); $i = 0; $ii = 1; $star[] = "★★★"; $star[] = "★★★★"; $star[] = "★★★★"; $star[] = "★★★★"; $star[] = "★★★★★"; $star[] = "★★★★★"; $star[] = "★★★★★"; while($ii<6){ $v = explode(",",$h[$i]); if(isset($img)){ foreach($img as $val){ if($val==$v[2]){ ++$i; continue; } } }else{ $img[] = $v[2]; } shuffle($star); print '<p class="jyunni"><mark>第'.$ii.'位</mark>'.$v[1].'</p>'; print '<div class="box clearfix"><p class="s_img"><a href="'.$v[0].'"><img src="'.$v[3].'" /></a><p>'; print '<ul><li>人気度:'.$star[0].'</li><li>人気ポイント:<br /><span class="mini">'.$v[2].'</span></li><li class="btn"><a href="'.$v[0].'" class="btn1">詳細を見る</a></li></ul></div>'; ++$i; ++$ii; } ?> 分かる方教えてください。

みんなの回答

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

CSVファイルはデータとして改行コードを保持出来る仕様になっています。全部を読み込んでから改行コードで分割するのは「データ中に改行コードがない」というのが大前提ですが、それでいいんですよね? それでもCSVファイルをカンマでexplodeするのもどうかと思う(データとしてカンマが存在する可能性が案外にある)。 ざっくりと書き直しましたが、仕様が不明な部分は適当な処理になってます。 #$star はいったいどうやろうとしているのか読み取れませんでした。 <?php $arr = file("http://example.com/csv/koukoku.csv", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // CSVがSJISのときは下記を有効にする // mb_convert_variables('utf-8', 'cp932', $arr); shuffle($arr); $star = "★★★★★"; $out = <<<EOD <p class="jyunni"><mark>第%d位</mark>%s</p> <div class="box clearfix"> <p class="s_img"><a href="%s"><img src="%s" /></a><p> <ul> <li>人気度:%s</li> <li>人気ポイント:<br /><span class="mini">%d</span></li> <li class="btn"><a href="%s" class="btn1">詳細を見る</a></li> </ul> </div> EOD; $ct = 0; foreach ($arr as $line) { $ct++; list($url, $title, $point, $img) = str_getcsv($line); printf($out, $ct, h($title), $url, h($img), mb_substr($star,0,rand(3,5)), intval($point ), $url); if ($ct >= 5) { break; } } function h($arg) { return htmlspecialchars($arg, ENT_QUOTES); }

kanashufu
質問者

お礼

ありがとうございます。 CSVデータの中にはカンマで広告先URLや人気ポイントなどを区切ったものが5行あります。 この方法で試してみます。

すると、全ての回答が全文表示されます。
  • akauntook
  • ベストアンサー率19% (295/1481)
回答No.1

カテゴリーは技術者向のようですが、素人向けの回答で良いですかね? 本来回答すべきでないかもしれませんが、たまたま気が向いたので回答します。 まず、phpの省略タグを使うのは止めた方が良いです。 <?php と書きましょう。 次に、変数名は意味の分かる単語にしましょう。変数が何を表しているのかわかりづらいです。 $imgが定義されてません。 >現在はCSVファイルの中に5行広告があり、>出力している広告も5行です。 CSVファイルにあるのは広告ではありません。CSVファイルにはデータしかありません。ですので、CSVファイルには各行に一つの広告のデータがあり、その五行のデータを読み込み、5つの広告を出力しています。 と言うと、正しい意味になります。 読み込むデータの行が何行であろうと、出力する広告の数は5つだと書いてあります。 CSVファイルに10行の広告データがあっても5つの広告を出力すると思いますけど、まずは試しましょうよ。 あえて言うなら、逆にCSVのデータが5行未満だと $v = explode(",",$h[$i]); でエラーが起き データに不備があると配列$vに存在されない要素があるため、HTML出力部分にエラーかおきます。

kanashufu
質問者

お礼

すみません、素人です。 5行以上を試してます。ありがとうございました。

すると、全ての回答が全文表示されます。

専門家に質問してみよう