Простенькая функция с лапшой внутри:
spoilerpublic static function renderPaginator($total, $current, $indent = 3)
{
$start = 1 + $indent;
$end = $total - $indent;
$mid_start = $current - $indent;
$mid_end = $current + $indent;
?>
<nav style="margin: 0 auto;">
<ul class="pagination">
<?
$skip1 = ($current < $start || $current > $end);
if ($current == 1) { // previous
?><li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li><?
} else {
?><li><a href="?page=<?=($current-1)?>" aria-label="Previous"><span aria-hidden="true">«</span></a></li><?
}
for ($p = 1; $p <= $total; $p++) { // each page
if ($p == $current) {
?>
<li class="active"><a href="#"><?=$p?> <span class="sr-only">(текущая)</a></li><?
} else {
if($p < $start
|| ($p > $mid_start && $p < $mid_end)
|| $p > $end
|| ($p == $start && $p == $mid_start)
|| ($p == $end && $p == $mid_end)
) {
?>
<li><a href="?page=<?=$p?>"><?=$p?></a></li><?
} elseif($p == $start || $p == $end) {
?>
<li class="disabled"><a href="#">...</a></li><?
}
}
}
if ($current == $total) { // next
?><li class="disabled"><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li><?
} else {
?><li><a href="?page=<?=($current-1)?>" aria-label="Next"><span aria-hidden="true">»</span></a></li><?
}
?>
</ul>
</nav>
<?
}
На входе общее кол-во страниц, номер текущей страницы и, опционально, размер отступов.
При параметрах (100, 42, 3) выглядит как-то так:
1 -2 - 3 ... 39 - 40 - 41 - 42 - 43 -44 - 45 ... 98 - 99 -100