- ベストアンサー
CSVファイルから検索出力してページ毎に別けたい
- CSVファイルから検索結果を取得し、ページごとにデータを分ける方法について教えてください。
- データ量が多いCSVファイルを利用して、10件ずつページを分けたいですが、どのように記述すればよいでしょうか。
- 下記のURLを参考にしてアイテム別のページを作成しましたが、データ量が多くなってしまいました。どのようにすれば効果的にページを分けられますか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
for($i=$P*9;$i<$P*9+9;$i++){ のところ。 検索でヒットした場合のみカウントする必要がありますが、これだとヒットするしないにかかわらず$iがカウントされます。その結果、そのページの内でヒットした分だけが表示されるため「ページ毎に表示件数がバラバラ」になるのでしょう。 混乱しないようまずは該当データのみ抜き出してみるとか。 -------------------------------------- //ヒットしたデータ用の配列を用意 $Data_hit=array(); //とりあえずヒットするデータを取得する foreach($Data2 as $val){ $line=explode(",",$val); if($line[1]===$Cid) array_push($Data_hit,$line); } //ヒットしたデータを更に表示する分に切り詰める $Data_hit = array_slice($Data_hit,$P*9,9,TRUE); //あとは表示するだけ foreach($Data_hit as $line){ echo "$line[0] $line[1]<br>"; } ---------------------------------------- あるいは 2回まわすのがいやなら //件数は設定変更できるよう変数にしとく。 $kensuu = 9; //必要な計算をしておいて $start = $P*$kensuu; $end = $start+$kensuu; //該当データのカウント用 $c=0; //$Data2を回して… foreach($Data2 as $val){ $line=explode(",",$val); //該当しなければ、次へ if($line[1]!==$Cid) continue; //ここに来る=該当した、ということなのでカウントして ++$c; //$start以下なら、関係ないので次へ if( $c <=$start) continue; //$endまで来たら、おしまい if( $c >$end) break; //ここまで来れば、Hitかつ表示範囲内ということなので表示 echo "$line[0] $line[1]<br>"; } ---------------------------------------- とか。 あるいはまた、いちいち Page=3 とかで計算しないで直で表示開始の番号を受け取るAno2さんの方法でも。どちらにしても、せめてfunction、できればclassにした方がよいとは思いますが。
その他の回答 (2)
- shimix
- ベストアンサー率54% (865/1590)
fileで全件読み込んでいるのですから比較的楽なケースだと思います。「表示スキップ件数」をQueryStringで引き渡すようにして(存在しなければ0=スキップしない)forの開始数値を変えるだけでいいと思います。 最後まで表示していなければ(forのLoop内で表示件数の条件でbreakするときには)「次の○○件」のanchor要素を出力(QueryStringで、?skip=10などを生成)すればいいです(件数部分は($skip + 10)で書けます)。
補足
ありがとうございます! 回答者No.1さんとは別のやり方なのでしょうか QueryStringというのを参考書で調べましたが載ってませんでした なのでググって調べてみましたがよくわかりませんでした QueryStringとはどういう処理をする物なのでしょうか?
- JaneDue
- ベストアンサー率75% (263/350)
たくさんあるデータをページ分割して表示したいということですよね。 データを表示するほかに、次へ >> などでのページ送りのリンクも必要になってきます。「ページング」と呼ばれていて、あちこちで解説されていますからググってみてくだい。 考え方の一例として、1ページ10件で、Page=1 等で受け取れば、 Page=1の時 0~ 9 Page=2の時 10~19 Page=3の時 20~29 ~ となりますよね。ということは、 ($Page -1) x 件数 から (件数)個のデータを取得・表示すればよいということになります。 以下が分かりやすいかも。 http://fstyle.ddo.jp/archives/2005/10/cgiphp_1.html http://tenderfeel.xsrv.jp/php/639/ ※一応「 PHP ページャー 」で探せばPEARをはじめいろいろ配布されてはいますが、一度自分のロジックで作成してみることをお勧めします。
お礼
ありがとうございます!質問のURLと同じ所にある http://affiliate.aki-f.com/prog/page/38.html を参考にページ送りのリンクを作成し 10件以下の表示には成功出来たのですが for文の良い回し方?が思いつかず 現状ページ毎に表示件数がバラバラの状態です。 以下が現在のphp文章です 恐らく後一歩の段階だと思うのですがどうすれば良いのでしょうか… <?php require_once('common.php'); $Cid=$_GET['cid']; $P=$_GET["p"]; $Data=file('cat.csv'); $Data2=file('item.csv'); for($i=0;$i<sizeof($Data);$i++){ $line=explode(",",$Data[$i]); if($line[0]==$Cid){ $CatTitle=$line[1]; } } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title><?=$CatTitle?> | サンプルリンク集</title> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <body> <a href="index.php">HOME</a> <h1><?=$CatTitle?></h1> <?php //解説(2) if($P>0){ $Prev=$P-1; $PrevPage="<a href='cat.php?cid=1&p={$Prev}'>前の10件</a>"; } //解説(3) $Size=sizeof($Data2); if($Size/10-1>$P){ $Next=$P+1; $NextPage="<a href='cat.php?cid=1&p={$Next}'>次の10件</a>"; } echo "$PrevPage $NextPage"; echo "<br />"; ?> <table border="1"> <tbody valign="top"> <?php for($i=$P*9;$i<$P*9+9;$i++){ $line=explode(",",$Data2[$i]); if($line[2]==$Cid){ $ImageLink=DeleteEsc($line[2]); $TextLink =DeleteEsc($line[3]); ?> <tr> <td><?=$ImageLink?></td> <td> <?=$TextLink?><br><br> <a href="item.php?id=<?=$line[0]?>">詳細を見る</a> </td> </tr> <?php } } ?> </tbody> </table> </body> </html>
補足
無事やりたい事が出来ました これから自分でイジりながら改良して行きたいと思います 本当にありがとうございました!