• ベストアンサー

CSVでアップロードしたデータのランダム表示

はじめまして。 質問させてください。 CSVでアップロードしたデータをランダムで表示させたいのですが、 私自身、PHPの知識がほとんどなく困っています。 CSVで15件程の商品データをアップロードし、その中から5件をhtml上に ランダムに表示したいと考えています。 #CSV hoge.jpg,商品名,価格,評価,レビュー hoge.jpg,商品名,価格,評価,レビュー hoge.jpg,商品名,価格,評価,レビュー hoge.jpg,商品名,価格,評価,レビュー hoge.jpg,商品名,価格,評価,レビュー (15件ほど) #PHP <?php $fp = fopen("hoge.csv", "r"); $count = 1; while ($data = fgetcsv($fp, 10000)) { if ($count == 6) break; print <<<EOD <div class="hoge"> <p class="hogehoge"><img src="hoge/$data[0]" /></p> <dl> <dt><a href="hoge.html">商品名:$data[1]</a></dt> <dd>価格:$data[2]</dd> <dd>評価: $data[3]</dd> <dd>レビュー:$data[4]</dd> </dl> </div> EOD; $count++ ; } fclose($fp) ?> と自分なりに試してみたのですが… 15件のうち5件だけを表示することはできたのですが、 それをランダムに表示するにはどこをどうしたらいいのやら… といった状況です。 どうか、お力をお貸しください。

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

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

shuffleが使えます。 http://www.phppro.jp/phpmanual/php/function.shuffle.html あとは順番に5個取り出すだけです。

sabeck
質問者

お礼

shuffleをどう組み込めばよいのかがいまいちわからず、現在調べているところです。ありがとうございました。

その他の回答 (4)

回答No.5

回答No.3の方の shuffle を使えば簡単ですね。 shuffleは次のように使えばいいと思います。 $temp[0] = 一行目の内容 $temp[1] = 二行目の内容 ・・・ となっていて $shuffle($temp) を実行すれば $temp[0] = 五行目の内容 $temp[1] = 七行目の内容 ・・・ のようにランダムになるので forやwhileで $temp[0]~$temp[4](5件の場合)を表示させるようにすればいいと思います。

sabeck
質問者

お礼

ご教授ありがとうございます。 無事解決しましたのでご報告です。 shuffle()を使った様々な方法を試し、 このようなコードで落ち着きました。 $Data=file('hoge.csv'); shuffle ($Data); for ( $i=1; $i<=3; $i++ ){ $line=explode(",",$Data[$i]); あとは$line[0] $line[1] $line[3]... のように割り当てました。 本当にありがとうございました。

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.4

ANo.1です。 rand()を使うより、No.3の方の挙げたshuffle()を使う方が楽に実現できますね。 ですのでrand()を使うことは考えなくてよいかと思います。 本件が解決して尚興味があれば試してみてください。

sabeck
質問者

お礼

わざわざありがとうございます。 shuffle()を使うことにより解決いたしましたが、rand()も覚えておかなくてはと思っています。 私自身まだまだ未熟ですのでもっともっと勉強していこうと思います。

回答No.2

自分もphpを始めて間もないで、もっといい方法があるかもしれません。 その点に関してはご了承ください。 1:CSVをfile関数で読み込む 例:$temp = file('hoge.csv'); fileで読み込めば$temp[0]に一行目、$temp[1]に二行目・・・となります。 2:rand関数で$tempの[]に入る数字をランダムに決める ランダムに0~14(15件の場合)から5つ表示するものを決めます。 3:split関数で行の内容を , で区切る $temp[0] = "あああ,AAA,111" という行なら $data = split(",",$temp[0])とすれば $data[0] = "あああ" $data[1] = "AAA"のようになります。 この3つを使えばできると思います。 詳しくは関数を検索などしてみてください。

sabeck
質問者

お礼

ご教授頂いた事を参考に色々試してみたのですが、 同じ商品が5つ並んでしまいます。 ソースは以下の通りです。 <?php $n = 5; $file = @file("hoge.csv"); $i = rand(0, 14); $data = split(",",$file[$i]); $i = 0; while ($i <= 4){ print <<<EOD <div class="hogehoge"> <p class="hoge"><img src="hoge/$data[0]" /></p> <dl> <dt><a href="hoge.html">商品名:$data[1]</a></dt> <dd>価格:$data[2]</dd> <dd>評価: $data[3]</dd> <dd>レビュー:$data[4]</dd> </dl> </div> EOD; $i++; } ?>

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

rand関数を使って対応できるでしょう。 http://www.php.net/manual/ja/function.rand.php fgetcsv()でcsvのデータを配列に格納した後、0から(配列の要素数-1)までの乱数を5個、重複しないように生成するといった感じになるでしょうか。

sabeck
質問者

お礼

rand関数を使ってみましたが、同じ商品が5つ並んでしまいます。 使い方が間違っているとは思うのですが…

関連するQ&A