Алгоритм интеллектуальной разбивки на страницы

Я ищу пример алгоритма умной разбивки на страницы. Разумно, я имею в виду, что я хочу показать, например, две соседние страницы на текущей странице, поэтому вместо того, чтобы заканчивать смехотворно длинный список страниц, я усекаю его.

Вот краткий пример, чтобы сделать его яснее … это то, что у меня есть сейчас:

Pages: 1 2 3 4 [5] 6 7 8 9 10 11 

Вот что я хочу в итоге:

 Pages: ... 3 4 [5] 6 7 ... 

(В этом примере я показываю только две соседние страницы на текущей странице)

Я реализую его в PHP / Mysql, и «базовая» разбивка на страницы (без перехвата) уже закодирована, я просто ищу пример для ее оптимизации … Это может быть пример на любом языке, если это дает мне представление о том, как его реализовать …

Некоторое время назад у меня была такая же потребность.

Вот статья, которую я использовал для ее создания (с помощью PHP-кода): разбиение на страницы Digg-Style Pagination

Он работает довольно быстро и имеет некоторые дополнения к тому, что вы пытаетесь сделать, например:

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

Kinda late =), но вот мой ход:

 function Pagination($data, $limit = null, $current = null, $adjacents = null) { $result = array(); if (isset($data, $limit) === true) { $result = range(1, ceil($data / $limit)); if (isset($current, $adjacents) === true) { if (($adjacents = floor($adjacents / 2) * 2 + 1) >= 1) { $result = array_slice($result, max(0, min(count($result) - $adjacents, intval($current) - ceil($adjacents / 2))), $adjacents); } } } return $result; } 

Пример:

 $total = 1024; $per_page = 10; $current_page = 2; $adjacent_links = 4; print_r(Pagination($total, $per_page, $current_page, $adjacent_links)); 

Выход ( @ Codepad ):

 Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) 

Другой пример:

 $total = 1024; $per_page = 10; $current_page = 42; $adjacent_links = 4; print_r(Pagination($total, $per_page, $current_page, $adjacent_links)); 

Выход ( @ Codepad ):

 Array ( [0] => 40 [1] => 41 [2] => 42 [3] => 43 [4] => 44 ) 

Я начал с сообщения lazaro и попытался создать надежный и легкий алгоритм с javascript / jquery … Никаких дополнительных и / или громоздких библиотек разбиения на страницы не нужно … Посмотрите на скрипку для живого примера: http://jsfiddle.net/ 97JtZ / 1 /

 var totalPages = 50, buttons = 5; var currentPage = lowerLimit = upperLimit = Math.min(9, totalPages); //Search boundaries for (var b = 1; b < buttons && b < totalPages;) { if (lowerLimit > 1 ) { lowerLimit--; b++; } if (b < buttons && upperLimit < totalPages) { upperLimit++; b++; } } //Do output to a html element for (var i = lowerLimit; i <= upperLimit; i++) { if (i == currentPage) $('#pager').append('<li>' + i + '</li> '); else $('#pager').append('<a href="#"><li><em>' + i + '</em></li></a> '); } 

Я сделал класс разбивки на страницы и недавно применил Google Code. Проверьте его довольно простой http://code.google.com/p/spaceshipcollaborative/wiki/PHPagination

 $paging = new Pagination(); $paging->set('urlscheme','class.pagination.php?page=%page%'); $paging->set('perpage',10); $paging->set('page',15); $paging->set('total',3000); $paging->set('nexttext','Next Page'); $paging->set('prevtext','Previous Page'); $paging->set('focusedclass','selected'); $paging->set('delimiter',''); $paging->set('numlinks',9); $paging->display(); 
 List<int> pages = new List<int>(); int pn = 2; //example of actual pagenumber int total = 8; for(int i = pn - 9; i <= pn + 9; i++) { if(i < 1) continue; if(i > total) break; pages.Add(i); } return pages; 

Я бы использовал что-то простое на странице, на которой вы показываете paginator, например:

 if ( $page_number == 1 || $page_number == $last_page || $page_number == $actual_page || $page_number == $actual_page+1 || $page_number == $actual_page+2 || $page_number == $actual_page-1 || $page_number == $actual_page-2 ) echo $page_number; 

Вы можете адаптировать его, чтобы показывать каждые 10 или около того страниц с помощью оператора %

Я думаю, что использование switch () будет лучше в этом случае, я просто не помню синтаксис сейчас

Будь проще 🙂

Если можно создать разбиение на страницы на клиенте, я бы предложил новый плагин Pagination: http://www.xarg.org/2011/09/jquery-pagination-revised/

Решение вашего вопроса будет:

 $("#pagination").paging(1000, { // Your number of elements format: '. - nncnn - ', // Format to get Pages: ... 3 4 [5] 6 7 ... onSelect: function (page) { // add code which gets executed when user selects a page }, onFormat: function (type) { switch (type) { case 'block': // n and c return '<a>' + this.value + '</a>'; case 'fill': // - return '...'; case 'leap': // . return 'Pages:'; } } }); 

Код класса разбиения на страницы CodeIgniter можно найти на GitHub

(то, что вы называете). Смарт-разбивка по страницам может быть достигнута путем конфигурации.

 $config['num_links'] = 2; 

Количество «цифровых» ссылок, которые вы хотели бы до и после выбранного номера страницы. Например, номер 2 поместит две цифры с обеих сторон, как в примерах ссылок в самой верхней части этой страницы.