Аргументы:
  • $format - строка-урл, должен быть %s для подстановки страниц
  • $found - количество найденных результатов
  • $page_id - номер страницы из GET-запроса
  • $limit - лимит, обычно 50
function get_pagination($format, $found, $page_id, $limit = 50) {

    $html = '<div class="paging">';
    $pagetpl = function($n, $alt = '') use ($page_id, $format) {

        $alt = $alt ?: $n+1;
        if ($n == $page_id) {
            return '<span class="page-active">'.$alt.'</span>';
        } else {
            return ' <a href="'.sprintf($format, $n).'" class="page">'.$alt.'</a> ';
        }
    };

    $max = (int)($found / $limit) + (($found % $limit) ? 0 : 1);
    if ($found == 0) $max = 0;

    $a = $page_id - 5;
    $a = max($a, 0);
    $b = $page_id + 5;
    if ($b >= $max) $b = $max;

    if ($page_id > 0) $html .= $pagetpl($page_id + 1, '←');

    if ($a > 0) $html .= $pagetpl(0);
    if ($a > 2) $html .= $pagetpl($a-1, '…');

    for ($n = $a; $n <= $b; $n++) $html .= $pagetpl($n);

    if ($b < $max - 1) $html .= $pagetpl($b+1, '…');
    if ($b < $max) $html .= $pagetpl($max);

    if ($page_id < $max) $html .= $pagetpl($page_id + 1, '→');

    return "$html</div>";
}