ページネーションを実装する際は
通常はSQLで取得する際にOFFSETとLIMITで取得するデータに制限をかけるが
今回はSQLではなくPHPでページネーションを実装する。
この際にJOINを使って結合もせず、PHPでMERGEを行う。
(独自関数をいじりたくないので無理やり。)
※フロント側も載せる。
バック側実装
$table_array1 = "独自関数でDBのデータを取得。";
$table_array2 = "独自関数でDBのデータを取得。";
$table_array3 = "独自関数でDBのデータを取得。";
// ひとつにまとめる
$table_list = array_merge($table_array1, $table_array2, $table_array3);
// 並び替え(DAYカラムで降順)
$sort_value = array_column($table_list, 'DAY');
array_multisort($sort_value, SORT_DESC, $table_list);
// 【ページャー作成】
// 取得したデータの数を取得
$total_count = count($table_list);
// 何件表示させるかを決める。
$search_limit = $_GET['limit'] ?: SEARCH_LIMIT;
// (取得したデータ÷表示件数)の結果を切り上げる。結果が0場合は1を格納
$max_page = ceil($total_count / $search_limit) ?: 1;
// 現在のページ getの値がない場合は1を格納
$page_num = $_GET['page_num'] ?: 1;
// 前ページ = 現在のページ-1
$prev_page_num = ($page_num - 1);
// 次ページ = 現在のページ+1
$next_page_num = ($page_num + 1);
// 表示を開始するデータ = 現在のページ-1* 表示件数
$offset = ($page_num - 1) * $search_limit;
// ページャーを作成
$table_list = array_slice($table_list, $offset, $search_limit);
解説
難しいことは書いていないと思うが、
// 表示を開始するデータ = 現在のページ-1* 表示件数
$offset = ($page_num - 1) * $search_limit;
が理解しにくいと思うので解説。
現在のページが2ページ目
表示件数が5件
取得データが20件だった場合
表示されているデータは5~9番目のデータである。
これを実装するために現在のページ2からー1をして1に。
この数字に対して表示件数5をかけると5になる。
つまり、「現在のページから1を引いてその数字に表示件数を書けた値からでデータを表示すれば」、
ページネーションがうまく実装できるといえる。
フロント側実装
// getでリダイレクトさせる
<form method="get" class="" action="リダイレクトさせる" enctype="multipart/form-data">
<div class="search_div">
<span>表示件数:</span>
<!-- 表示件数を表示、入力 -->
<input type="number" name="limit" min="1" value="<?php echo $search_limit; ?>" />
<!-- リセットボタン(今回実装していない)-->
<input type="button" class="" value="リセット">
<!-- 検索ボタン 押下で表示件数を変える-->
<input type="submit" class="" value="検索">
</div>
<div class="page_nav">
<!-- 取得したデータの数を表示-->
<span class=""><?php echo $total_count; ?>件</span>
<!-- 前ページボタン 遷移先設定用 パラメータを持たせる-->
<?php if ($prev_page_num >= 1) { ?>
<a class="" href=""><i class="fa-solid fa-circle-arrow-left fa-lg"></i></a>
<?php } else { ?>
<span class=""><i class="fa-solid fa-circle-arrow-left fa-lg"></i></span>
<?php } ?>
<!-- 現在のページを表示する、1~MAXページまで入力できる-->
<input type="number" name="page_num" value="<?php echo $page_num; ?>" min="1" max="<?php echo $max_page; ?>">
<span class="separator">/</span>
<!-- MAXページを表示-->
<span class="max_page"><?php echo $max_page; ?>ページ</span>
<!-- 次ページボタン 遷移先今はパラメータしか書いてないので遷移先など自分の画面に合わせて編集要。-->
<?php if ($next_page_num <= $max_page) { ?>
<a class="" href="page_num' => $next_page_num"><i class="fa-solid fa-circle-arrow-left fa-flip-horizontal fa-lg"></i></a>
<?php } else { ?>
<span class="link_button"><i class="fa-solid fa-circle-arrow-left fa-lg fa-flip-horizontal"></i></span>
<?php } ?>
</div>
</form>
解説
ページネーションは当たり前だが、別のページに遷移するわけではなく
同じ画面にパラメータを持たせてリダイレクトする。
なのでformとaタグの遷移先は同じ画面になるように設定して
必要なデータをパラメータで持たせるようにする。
aタグの遷移先のコードは今回参考のコードには諸事情で書けなかったですが
次ページボタンにパラメータのみ記載しているので参考に書いていただけたらと思います。