ページネーションで常に5件ページリンクを表示する[備忘録]

自分の勉強用です。

 

ページネーションコード

ページネーションで常に5件のリンクを表示&5件のページ未満の投稿数でもリンクを適切に表示するコードについて。

$start = max($page - 2, $first_page);
$end = min($start + 4, $total_pages);
if (($end - $start) < 4) {
$start = max($end - 4, $first_page);
}
for ($i = $start; $i <= $end; $i++) {
$pagination = $i;
}

min関数とmax関数について

min関数

min(配列)とした場合、min()は配列の中で最も小さい数値を返す。

min(1, 10)とした場合、min()はそれらの中で最も小さいものを返す。

異なる型の値を比較する際、例えばstringとintを比較するときには、数値0と評価する。

stringとstringを比較する場合は、ABC順で評価する。

返される値は何も変換されていない、元の形の値。

戻り値

異なる型で同じ値と評価される複数の値(0 と'abc')を渡した場合は関数に最初に渡されたほうを返す。

max関数

max配列)とした場合、max()は配列の中で最も大きい数値を返す。

max(1, 10)とした場合、max()はそれらの中で最も大きいものを返す。

それ以外は上記と同じ。

ページ一覧の最初と最後の定義

$start = max($page - 2, $first_page);

ページ一覧の最初と最後の数値は可変なので、「ページ数 < 5」でも「ページ数 >= 5」でも適切にページネーションが表示される必要がある。

5件のリンクを作成するので、ページ一覧の最初をまず定義する。

$page(現在のページ)がページネーションの中央に来ると考えると、$pageから -2したページが、ページ一覧の最初に来る。

しかし、ページ一覧の最初のページは1になるはずなので、「$page <= 2」の場合、-2したページは「0 or -1」になってしまう。

その場合に備えて、max関数で、$first_page(最初のページ)より$pageが小さい場合は$first_pageを$start(ページネーションで表示する最初のリンク)に代入するようにする。

$end = min($start + 4, $total_pages);

最初のページリンクが定義できたら、最後のページリンクを定義する。

ページリンクは5件表示するので、「最初のページリンク + 4」で最後のページリンクのページ数は計算できる。

ただ、ページ数の中央値を超えたページが$pageだった場合、$end(最後のページ)が存在しないページになってしまう。

なので、「$start + 4 > $total_page」の場合は、$total_pageが$endに代入されるようにmin関数を使用する。

これで、$end(最後のページリンク)の幅を決めることが出来る。

最大ページの一個前のページにいる時に起こる問題(ページリンクが5件以下になってしまう)

if (($end - $start) < 4) {
$start = max($end - 4, $first_page);
}

ページが全部で9ページの場合、「$page = 8」になるまでこのif文は使われない。

「$end - $start」が4より小さくなるのは、「$page = 8」からだからだ。

というのも、常に5件ページリンクをつくるのに、「$page = 8」の時、「$start = 6(8-2)」になるが、$endは「$total_page = 9」で、「6, 7, 8, 9」の4つしかリンク番号が作成されなくなってしまう。

そのため、「$end - $start」が4より小さい場合は、$startの位置をずらしてあげる必要がある。

そのために、「$end - 4」か$first_pageのうち、大きい方をmax関数で$startに再代入してあげる。

なぜ、「$end - 4」なのかというと、$endから4つ引いた位置は5件のページリンクの最初となるから。(あまり上手な説明となっていない‥汗)

ページネーションをつくる

for ($i = $start; $i <= $end; $i++) {
$pagination = $i;
}

ここまでで、ページネーションのリンクの下ごしらえはできたので、あとはHTMLで表示するために$pagination[]に「$start->$end」まで数値をfor文で++して代入してあげればいい。