1ページ当たり100件、ボタン表示数5個までのPHPページネーションサンプル。
変数定義の部分の$dataにページネーションにしたい配列を突っ込んで使ってください。
定数
- PAGER_DISP_NUM
- ボタンを何個まで表示するか
- PAGER_DATA_NUM
- 1ページにつき何件のデータを表示するか
- PAGER_RANGE_BEFORE
- 現在のボタンの前方向に表示するボタン数
- PAGER_RANGE_AFTER
- 現在のボタンの後方向に表示するボタン数
- PAGER_RANGE_FIRST_LAST
- 最初と最後ボタン数
- PAGER_RANGE_SECOND_PAGE_NEXT
- 2ページ目のボタン数
// ボタン表示個数
define("PAGER_DISP_NUM",5);
// 1ページあたりのデータ数
define("PAGER_DATA_NUM",100);
// 現在のボタンの前方向に表示するボタン数
define('PAGER_RANGE_BEFORE', 2);
// 現在のボタンの後方向に表示するボタン数
define('PAGER_RANGE_AFTER', 2);
// 最初と最後のボタン数
define('PAGER_RANGE_FIRST_LAST', 4);
// 2ページ目のボタン数
define('PAGER_RANGE_SECOND_PAGE_NEXT', 3);
初期化
// 総データ数
$data_num = 0;
// 総ページ数
$page_num = 0;
// 現在のページ(ページングが始まっていない状態を-1とする)
$now_page = -1;
// 現在のページに表示するデータ
$disp_data = [];
変数定義
ページネーションにしたい配列を$dataに突っ込む
// 総データ数
$data_num = count($data);
// 総ページ数(総データ数 / 1ページあたりのデータ数)
$page_num = ceil($data_num / PAGER_DATA_NUM);
// 現在のページ
$now_page = isset($_POST['page']) ? $_POST['page'] : 1;
// 現在のページと配列のインデックスを対応させる
$nth = ($now_page - 1) * PAGER_DATA_NUM;
// 現在のページに表示するデータ(配列の$nth番目からPAGER_DATA_NUM個のデータ)
$disp_data = array_slice($data, $nth, PAGER_DATA_NUM, true);
表示
- $start_btn
- 先頭のページ数(ボタン)
- $end_btn
- 最後のページ数(ボタン)
<p>
検索結果:<?php echo $data_num; ?>件
<?php if ($data_num > 1): ?>
(<?php echo h($nth + 1); ?>件目〜<?php echo h(min($nth + PAGER_DATA_NUM, $data_num)); ?>件目)
<?php endif; ?>
</p>
<p>
<?php
// ページングが始まっている場合
if(($data_num > 0) && ($now_page !== -1)){
if($page_num == 1){
// ページ数が1ページしかない場合
echo '<button type="submit" name="page" class="this-page this-page-middle" value=" ">1</button>';
}else{
// ページ数が1ページ以上ある場合
// ボタン表示範囲定義
if($now_page == 1){
// 1ページ目 1 2 3 4 5 次へ>>
$start_btn = max(1, $now_page - PAGER_RANGE_BEFORE);
$end_btn = $start_btn + PAGER_RANGE_FIRST_LAST;
}elseif($now_page == 2){
// 2ページ目 <<前へ 1 2 3 4 5 次へ>>
$start_btn = max(1, $now_page - PAGER_RANGE_BEFORE);
$end_btn = min($page_num, $now_page + PAGER_RANGE_SECOND_PAGE_NEXT);
}elseif($now_page == $page_num){
// 最終ページ <<前へ 6 7 8 9 10
$start_btn = $page_num - PAGER_RANGE_FIRST_LAST;
$end_btn = $page_num;
}else{
// 中間のページ <<前へ 4 5 6 7 8 次へ>>
$start_btn = max(1, $now_page - PAGER_RANGE_BEFORE);
$end_btn = min($page_num, $now_page + PAGER_RANGE_AFTER);
}
// ボタン表示
// 「<<前へ」(2ページ目以降の場合)
if ($now_page > 1){
echo '<button type="submit" name="page" class="next" value="'.($now_page - 1).'"><<前へ</button>';
}
// ページ数 $iが今のページかどうかでボタンのクラスを変える
for ($i = $start_btn; $i <= $end_btn; $i++) {
echo '<button type="submit" name="page" class="'.($i == $now_page ? 'this-page' : 'next') .' this-page-middle" value="'.$i.'">'.$i.'</button>';
}
// 「次へ>>」($now_pageと$page_numが初期値じゃない || 最後のページじゃない場合)
if(($now_page == 0 && $page_num == 0) || (!($now_page == $page_num))){
echo '<button type="submit" name="page" class="next-right-end" value="'.($now_page + 1).'">次へ>></button>';
}
}
}
?>
</p>
<?php foreach ($disp_data as $data) { ?>
<tr>
<td class="listUser"><?php echo $data['']; ?></td>
<td class="listUser"><?php echo $data['']; ?></td>
<td class="listUser"><?php echo $data['']; ?></td>
</tr>
<?php } ?>