• 締切済み

ページ送りするには

データ数が「$data = 300」ある時などにページ送りのリンクを 1ページに30データとして10ページ分のリンクが必要ですが 一度に10ページのリンクを作らず、 1 2 3 4 5 >次へ 前へ< 6 7 8 9 10 という様なページ送りを表示したいのですが分からないので困っています。お願いします。

みんなの回答

回答No.2

use strict は、安全でない構文に警告を出してくれます。 そのまま外して構いません。コード自体に変更はいりませんよ。 下記のスクリプトの foreach の中身だけ、処理を書き換えてください。

k_7
質問者

お礼

お手数かけましたが使用中のものを いじっていたら、何とかできました。

k_7
質問者

補足

ありがとうございます。 現在は下のようなものを使っています。 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でも・・・

回答No.1

説明が難しいので、少し表を用意してみます。   ページ番号  +------------------  | 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"; }

k_7
質問者

補足

ありがとうございます。 use strict; を 使わない方法もあるのでしょうか?

関連するQ&A