![](https://web-dev.xyz/wp-content/uploads/2014/11/アイキャッチ1.jpg)
以前「フォームやURLのパラメータから値を取得する$_GETの使い方」の記事で簡単なページングの例を作成しましたが、この記事ではもう少し実用的なページング(ページネーション)を紹介したいと思います。良いものができたら随時追加していく予定です。
前回のおさらい
前回は下記のような一番シンプルなページングを作成しました。
<?php $totalPage = 10; if ( isset($_GET["page"]) && $_GET["page"] > 0 && $_GET["page"] <= $totalPage ) { $page = (int)$_GET["page"]; } else { $page = 1; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>サンプル</title> </head> <body> <p>現在 <?php echo $page; ?> ページ目です。</p> <p> <?php if ($page > 1) : ?> <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a> <?php endif; ?> <?php if ($page < $totalPage) : ?> <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a> <?php endif; ?> </p> </body> </html>
解説
$totalPage = 10;
3行目でトータルのページ数を指定しています。
if ( isset($_GET["page"]) && $_GET["page"] > 0 && $_GET["page"] <= $totalPage ) { $page = (int)$_GET["page"]; } else { $page = 1; }
4~12行目では、「URLのパラメータにpageが存在しない場合」「pageが0以下」「pageがトータルページを超えている場合」に1ページ目を表示するように処理しています。9行目では悪意のある値を受け付けないように数値にキャスト(変換)しています。
<p>現在 <?php echo $page; ?> ページ目です。</p>
22行目では現在のページを表示しています。
<?php if ($page > 1) : ?> <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a> <?php endif; ?>
25〜27行目では、現在のページが2ページ目以降であれば1ページ戻るリンクを表示するようにしています。
<?php if ($page < $totalPage) : ?> <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a> <?php endif; ?>
28〜30行目では、現在のページがトータルページより小さければ1ページ進むリンクを表示するようにしています。
前後に指定したページ数を表示する
前後に指定したページ数を表示する方法です。
<?php $totalPage = 20; $range = 3; if ( isset($_GET["page"]) && $_GET["page"] > 0 && $_GET["page"] <= $totalPage ) { $page = (int)$_GET["page"]; } else { $page = 1; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>サンプル</title> </head> <body> <p>現在 <?php echo $page; ?> ページ目です。</p> <p> <?php if ($page > 1) : ?> <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a> <?php endif; ?> <?php for ($i = $range; $i > 0; $i--) : ?> <?php if ($page - $i < 1) continue; ?> <a href="?page=<?php echo ($page - $i); ?>"><?php echo ($page - $i); ?></a> <?php endfor; ?> <span><?php echo $page; ?></span> <?php for ($i = 1; $i <= $range; $i++) : ?> <?php if ($page + $i > $totalPage) break; ?> <a href="?page=<?php echo ($page + $i); ?>"><?php echo ($page + $i); ?></a> <?php endfor; ?> <?php if ($page < $totalPage) : ?> <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a> <?php endif; ?> </p> </body> </html>
解説
$totalPage = 10; $range = 3;
3行目でトータルのページ数を指定、4行目で前後に表示するページ数を指定しています。
if ( isset($_GET["page"]) && $_GET["page"] > 0 && $_GET["page"] <= $totalPage ) { $page = (int)$_GET["page"]; } else { $page = 1; }
5~13行目では、「URLのパラメータにpageが存在しない場合」「pageが0以下」「pageがトータルページを超えている場合」に1ページ目を表示するように処理しています。10行目では悪意のある値を受け付けないように数値にキャスト(変換)しています。
<p>現在 <?php echo $page; ?> ページ目です。</p>
23行目では現在のページを表示しています。
<?php if ($page > 1) : ?> <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a> <?php endif; ?>
26〜28行目では、現在のページが2ページ目以降であれば1ページ戻るリンクを表示するようにしています。
<?php for ($i = $range; $i > 0; $i--) : ?> <?php if ($page - $i < 1) continue; ?> <a href="?page=<?php echo ($page - $i); ?>"><?php echo ($page - $i); ?></a> <?php endfor; ?>
30〜33行目では、$iに$rangeを代入し、$iを1ずつマイナスしながら0になるまでforで繰り返しを行います。
現在のページから$iを引いた数値が0以下になる場合、そのページは存在しないためcontinueでスキップします。1以上の場合はそのページへのリンクを表示します。
<span><?php echo $page; ?></span>
35行目では、現在のページを表示しています。
<?php for ($i = 1; $i <= $range; $i++) : ?> <?php if ($page + $i > $totalPage) break; ?> <a href="?page=<?php echo ($page + $i); ?>"><?php echo ($page + $i); ?></a> <?php endfor; ?>
37〜40行目では、$iに1を代入し、$iを1ずつプラスしながら$rangeになるまでforで繰り返しを行います。
現在のページに$iを足した数値がトータルページを超える場合、そのページは存在しないためbreakでループを終了します。超えない場合はそのページへのリンクを表示します。
<?php if ($page < $totalPage) : ?> <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a> <?php endif; ?>
42〜44行目では、現在のページがトータルページより小さければ1ページ進むリンクを表示するようにしています。
前後に指定したページ数を表示する(その2)
上記と同じく前後に指定したページ数を表示する方法ですが、前に表示するページ数がなければその分を後ろに(後ろに表示するページ数がなければその分前に)表示する方法です。表示される件数が常に同じになります。
<?php $totalPage = 20; $range = 3; if ( isset($_GET["page"]) && $_GET["page"] > 0 && $_GET["page"] <= $totalPage ) { $page = (int)$_GET["page"]; } else { $page = 1; } $prevDiff = 0; if ($page - $range < 1) { $prevDiff = $range - $page + 1; } $nextDiff = 0; if ($page + $range > $totalPage) { $nextDiff = $page + $range - $totalPage; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>サンプル</title> <meta name="robots" content="noindex, nofollow" /> </head> <body> <p>現在 <?php echo $page; ?> ページ目です。</p> <p> <?php if ($page > 1) : ?> <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a> <?php endif; ?> <?php for ($i = $range + $nextDiff; $i > 0; $i--) : ?> <?php if ($page - $i < 1) continue; ?> <a href="?page=<?php echo ($page - $i); ?>"><?php echo ($page - $i); ?></a> <?php endfor; ?> <span><?php echo $page; ?></span> <?php for ($i = 1; $i <= $range + $prevDiff; $i++) : ?> <?php if ($page + $i > $totalPage) break; ?> <a href="?page=<?php echo ($page + $i); ?>"><?php echo ($page + $i); ?></a> <?php endfor; ?> <?php if ($page < $totalPage) : ?> <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a> <?php endif; ?> </p> </body> </html>
解説
$totalPage = 20; $range = 3;
3行目でトータルのページ数を指定、4行目で前後に表示するページ数を指定しています。
if ( isset($_GET["page"]) && $_GET["page"] > 0 && $_GET["page"] <= $totalPage ) { $page = (int)$_GET["page"]; } else { $page = 1; }
5~13行目では、「URLのパラメータにpageが存在しない場合」「pageが0以下」「pageがトータルページを超えている場合」に1ページ目を表示するように処理しています。10行目では悪意のある値を受け付けないように数値にキャスト(変換)しています。
$prevDiff = 0; if ($page - $range < 1) { $prevDiff = $range - $page + 1; } $nextDiff = 0; if ($page + $range > $totalPage) { $nextDiff = $page + $range - $totalPage; }
15〜23行目では、前に表示するページ数がない場合に後ろに持っていくための差分と、後ろに表示するページ数がない場合に前に持っていくための差分を変数($prevDiffと$nextDiff)に代入しています。
<p>現在 <?php echo $page; ?> ページ目です。</p>
34行目では現在のページを表示しています。
<?php if ($page > 1) : ?> <a href="?page=<?php echo ($page - 1); ?>">前のページへ</a> <?php endif; ?>
37〜39行目では、現在のページが2ページ目以降であれば1ページ戻るリンクを表示するようにしています。
<?php for ($i = $range + $nextDiff; $i > 0; $i--) : ?> <?php if ($page - $i < 1) continue; ?> <a href="?page=<?php echo ($page - $i); ?>"><?php echo ($page - $i); ?></a> <?php endfor; ?>
41〜44行目では、$iに$rangeと$nextDiffを代入して$iを1ずつマイナスしながら0になるまでforで繰り返しを行います。
現在のページから$iを引いた数値が0以下になる場合、そのページは存在しないためcontinueでスキップします。1以上の場合はそのページへのリンクを表示します。
<span><?php echo $page; ?></span>
46行目では、現在のページを表示しています。
<?php for ($i = 1; $i <= $range + $prevDiff; $i++) : ?> <?php if ($page + $i > $totalPage) break; ?> <a href="?page=<?php echo ($page + $i); ?>"><?php echo ($page + $i); ?></a> <?php endfor; ?>
48〜51行目では、$iに1を代入し、$iを1ずつプラスしながら$range+$prevDiffになるまでforで繰り返しを行います。
現在のページに$iを足した数値がトータルページを超える場合、そのページは存在しないためbreakでループを終了します。超えない場合はそのページへのリンクを表示します。
<?php if ($page < $totalPage) : ?> <a href="?page=<?php echo ($page + 1); ?>">次のページへ</a> <?php endif; ?>
53〜55行目では、現在のページがトータルページより小さければ1ページ進むリンクを表示するようにしています。