вот мой вариант
ex.tmweb.ru/paginator
вот метод который выдает массив номеров страниц в зависимости от количества
private function getNumbers($pagesCount)
{
$numbers = [];
$rangeL = $this->page - $this->range - 1;
if ($rangeL < 1) {
$rangeL = 1;
}
$rangeR = $rangeL + $this->range * 2 + 1;
if ($rangeR > $pagesCount) {
$rangeR = $pagesCount;
$rangeL = $pagesCount - $this->range * 2 + 1;
if ($rangeL < 1) {
$rangeL = 1;
}
}
if ($rangeL > 1) {
$numbers[] = 1;
if ($rangeL > 2) {
$rangeL++;
$numbers[] = false;
}
}
for ($i = $rangeL; $i <= $rangeR; $i++) {
$numbers[] = $i;
}
if ($rangeR < $pagesCount) {
if ($rangeR < $pagesCount - 2) {
$numbers[] = false;
} else {
$numbers[] = $pagesCount - 1;
}
$numbers[] = $pagesCount;
}
return $numbers;
}
$this->page - номер текущей страницы (нумерация не с 0 а с 1)
$this->range - по сколько кнопок страниц показывать вокруг выбранной (в примере задано 4)
пропуски добавляются в него как false, при рендрежке потом можно заменить каким-то контролом или троеточием как в примере