- 締切済み
ページ送りするには
データ数が「$data = 300」ある時などにページ送りのリンクを 1ページに30データとして10ページ分のリンクが必要ですが 一度に10ページのリンクを作らず、 1 2 3 4 5 >次へ 前へ< 6 7 8 9 10 という様なページ送りを表示したいのですが分からないので困っています。お願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tamahiro22
- ベストアンサー率44% (8/18)
use strict は、安全でない構文に警告を出してくれます。 そのまま外して構いません。コード自体に変更はいりませんよ。 下記のスクリプトの foreach の中身だけ、処理を書き換えてください。
- tamahiro22
- ベストアンサー率44% (8/18)
説明が難しいので、少し表を用意してみます。 ページ番号 +------------------ | 1 2 3 4 5 階| 6 7 8 9 10 層| 11 12 13 14 15 | 16 17 18 19 20 まず、ページ番号を割り出す必要があります。 $data が 300 で、30件ずつの表示ならば、10ページ目の“最後”ですね。 そして、上の表で見れば分かると思いますが、 階層としては2番目ということになります。 ページ番号を、並べる数である 5 で割れば階層が分かりますね? 割り切れなかった場合は、小数点以下を切り捨てた数値に1を足せば割り出せるということも想像がつくでしょう。 これは、ページ番号を割り出す際も同じです。 30 件で割って余りが出る結果はページの範囲を超えているので1を足す必要があります。 階層の開始番号は、前の階層の終了番号+1になるので、 (階層-1) * 5 + 1 という感じでしょうか。 今、即興で考えたので間違えているかも知れませんが、 こんな感じの考え方で実装できると思います。 use strict; my $data = 300; my $page = $data % 30 ? (int($data/30)+1) : $data / 30; my $layer = $page % 5 ? (int($page/5)+1) : $page / 5; my $offset = ($layer-1) * 5 + 1; foreach my $num ($offset..$offset+5-1) { if ($num == $page) { print "now: $num\n" and next } print "$num\n"; }
補足
ありがとうございます。 use strict; を 使わない方法もあるのでしょうか?
お礼
お手数かけましたが使用中のものを いじっていたら、何とかできました。
補足
ありがとうございます。 現在は下のようなものを使っています。 open FILE,$logfile; @logdat = <FILE>; close FILE; $data = int((@logdat - 1)/30) + 1; ($in{'page'} >= 1 and $in{'page'} <= $data) or $in{'page'} = 1; foreach$l(0..$#logdat){ $l >= ($in{'page'} - 1) * 30 and $l < $in{'page'} * 30 and $log .= $logdat[$l]; } foreach$p(1..$data){ if($p == $in{'page'}){ $pagelink .= <<"EOT"; <b>$p</b> EOT }else{ $pagelink .= <<"EOT"; [<a href="$mycgi?page=$p">$p</a>] EOT } } 現在はデータの数が多いとその分数だけリンクが作成されてしまいます。50でも100でも・・・