0
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

ページネーションにしたい配列を突っ込むだけ

Last updated at Posted at 2024-06-25

1ページ当たり100件、ボタン表示数5個までのPHPページネーションサンプル。
変数定義の部分の$dataにページネーションにしたい配列を突っ込んで使ってください。

image.png

定数

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
最後のページ数(ボタン)

image.png

<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 } ?>
                                                
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0