php ページネーション

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648477/9974a2f0-613a-9f25-0bca-07a09230a097.png)


# 定数
<dl>
  <dt>PAGER_DISP_NUM</dt>
  <dd>ボタンを何個まで表示するか</dd>
  <dt>PAGER_DATA_NUM</dt>
  <dd>1ページにつき何件のデータを表示するか</dd>  
  <dt>PAGER_RANGE_BEFORE</dt>
  <dd>現在のボタンの前方向に表示するボタン数</dd>
  <dt>PAGER_RANGE_AFTER</dt>
  <dd>現在のボタンの後方向に表示するボタン数</dd>
  <dt>PAGER_RANGE_FIRST_LAST</dt>
  <dd>最初と最後ボタン数</dd>
  <dt>PAGER_RANGE_SECOND_PAGE_NEXT</dt>
  <dd>2ページ目のボタン数</dd>
</dl>



```php
// ボタン表示個数
define("PAGER_DISP_NUM",5);

// １ページあたりのデータ数
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);
```

# 初期化
```php
// 総データ数
$data_num = 0;  

// 総ページ数
$page_num = 0;  

// 現在のページ(ページングが始まっていない状態を-1とする)
$now_page = -1;

// 現在のページに表示するデータ
$disp_data = [];
```
# 変数定義
:::note info
ページネーションにしたい配列を$dataに突っ込む
:::
```php
// 総データ数
$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);  
```


# 表示
<dl>
  <dt>$start_btn</dt>
  <dd>先頭のページ数(ボタン)</dd>
  <dt>$end_btn</dt>
  <dd>最後のページ数(ボタン)</dd>  
</dl>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648477/9958e028-36bc-a80e-05a7-d6a57ba35568.png)


```php
<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 } ?>
                                                
```