пейджинг, например, stackoverflow

Я новичок в php, особенно для создания разбивки на страницы.

мой вопрос в том, как сделать подкачку, как разбиение страницы stackoverflow?
я имею в виду подкачку:

1 … 5 6 7 8 9 … 25
(первое число и последнее число всегда появляются, но посередине только 5 номеров с выбранной страницей абсолютно посередине)

в php я попытался сделать пейджинг,

<?php //Show page links for($i=1; $i<=$pages; $i++) { echo '<li id="'.$i.'">'.$i.'</li>'; } ?> 

но будет показано все страницы, такие как

1 2 3 4 5 6 7 8 9 10 и т. Д.

любой орган имеет простой логический пример для решения этой проблемы?
большое спасибо 🙂

Ниже приведен фрагмент из общего класса pagination 1, который я написал несколько лет назад. Я отредактировал его, чтобы показать только соответствующие части.

 // cntAround is the number of pages to show before and after the current function renderNavigation($cntAround = 1) { $out = ''; $isGap = false; // A "gap" is the pages to skip $current = // Current page $cntPages = // Total number of pages for ($i = 0; $i < $pages; $i++) { // Run through pages $isGap = false; // Are we at a gap? if ($cntAround >= 0 && $i > 0 && $i < $cntPages - 1 && abs($i - $current) > $cntAround) { // If beyond "cntAround" and not first or last. $isGap = true; // Skip to next linked item (or last if we've already run past the current page) $i = ($i < $current ? $current - $cntAround : $cntPages - 1) - 1; } $lnk = ($isGap ? '...' : ($i + 1)); // If gap, write ellipsis, else page number if ($i != $current && !$isGap) { // Do not link gaps and current $lnk = '<a href="?page=' . ($i + 1) . '">' . $lnk . '</a>'; } $out .= "\t<li>" . $lnk . "</li>\n"; // Wrap in list items } return "<ul>\n" . $out . '</ul>'; // Wrap in list } 

Пример 1

cntAround = 1 , current = 5 , cntPages = 9 :

 [1] ... [4] 5 [6] ... [9] 

Пример 2.

cntAround = 3 , current = 5 , cntPages = 11 :

 [1] [2] [3] [4] 5 [6] [7] [8] ... [11] 

1) Статья находится на датском языке. Версия Google Translate'd здесь .

Это приведет к генерированию чисел в соответствии с приведенным выше значением current = 7, pages = 25. Замените номера ссылками, чтобы получить фактический индекс разбивки на страницы.

 $current = 7; $pages = 25; $links = array(); if ($pages > 3) { // this specifies the range of pages we want to show in the middle $min = max($current - 2, 2); $max = min($current + 2, $pages-1); // we always show the first page $links[] = "1"; // we're more than one space away from the beginning, so we need a separator if ($min > 2) { $links[] = "..."; } // generate the middle numbers for ($i=$min; $i<$max+1; $i++) { $links[] = "$i"; } // we're more than one space away from the end, so we need a separator if ($max < $pages-1) { $links[] = "..."; } // we always show the last page $links[] = "$pages"; } else { // we must special-case three or less, because the above logic won't work $links = array("1", "2", "3"); } echo implode(" ", $links); 

Вывод:

 1 ... 5 6 7 8 9 ... 25 

В некотором роде (псевдокод):

 pg = CurrentPageNo low = 1 high = MAX_PAGES if (pg-low <=5) output 1 to pg-1 [with links] else output 1..3 [with links] output "..." output (pg-3) to (pg-1) [with links] output pg if (high - pg <=5) output pg+1 to high [with links] else output (pg+1) to high-3 [with links] output "..." output (high-2) to high [with links] 

Вы можете использовать Zend_Paginator, чтобы сделать это, и научиться использовать Zend Framework, пока вы на нем.

Ниже приведена ссылка на php-классы, где вы можете скачать php-класс для разбивки на страницы.

http://www.phpclasses.org/search.html?words=paging&x=0&y=0&go_search=1

Если вы (возможно, потенциально) имеете большое количество страниц, подумайте об использовании «логарифмической» навигации по страницам, как описано здесь (пример кода включен):

Как выполнять навигацию по страницам для многих, многих страниц? Логарифмическая навигация по страницам

(Обратите внимание, что это будет отлично работать и для небольшого количества страниц, конечно же!)