プロが教えるわが家の防犯対策術!

はじめまして。
質問させてください。

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件だけを表示することはできたのですが、
それをランダムに表示するにはどこをどうしたらいいのやら…
といった状況です。

どうか、お力をお貸しください。

A 回答 (5件)

shuffleが使えます。


http://www.phppro.jp/phpmanual/php/function.shuf …
あとは順番に5個取り出すだけです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/10/15 16:19

回答No.3の方の shuffle を使えば簡単ですね。



shuffleは次のように使えばいいと思います。

$temp[0] = 一行目の内容
$temp[1] = 二行目の内容
・・・

となっていて
$shuffle($temp) を実行すれば

$temp[0] = 五行目の内容
$temp[1] = 七行目の内容
・・・

のようにランダムになるので

forやwhileで $temp[0]~$temp[4](5件の場合)を表示させるようにすればいいと思います。
    • good
    • 1
この回答へのお礼

ご教授ありがとうございます。

無事解決しましたのでご報告です。
shuffle()を使った様々な方法を試し、
このようなコードで落ち着きました。

$Data=file('hoge.csv');
shuffle ($Data);

for ( $i=1; $i<=3; $i++ ){
$line=explode(",",$Data[$i]);

あとは$line[0] $line[1] $line[3]...
のように割り当てました。

本当にありがとうございました。

お礼日時:2009/10/15 18:01

ANo.1です。



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

わざわざありがとうございます。

shuffle()を使うことにより解決いたしましたが、rand()も覚えておかなくてはと思っています。

私自身まだまだ未熟ですのでもっともっと勉強していこうと思います。

お礼日時:2009/10/15 17:57

自分も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つを使えばできると思います。
詳しくは関数を検索などしてみてください。
    • good
    • 0
この回答へのお礼

ご教授頂いた事を参考に色々試してみたのですが、
同じ商品が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++;

}
?>

お礼日時:2009/10/15 16:17

rand関数を使って対応できるでしょう。


http://www.php.net/manual/ja/function.rand.php

fgetcsv()でcsvのデータを配列に格納した後、0から(配列の要素数-1)までの乱数を5個、重複しないように生成するといった感じになるでしょうか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/10/15 16:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!