智能分页算法

jea*_*las 32 php pagination

我正在寻找智能分页的示例算法.通过智能,我的意思是我只想显示例如当前页面的2个相邻页面,所以不是以一个可笑的长页面列表结束,而是截断它.

这是一个让它更清晰的快速示例......这就是我现在所拥有的:

Pages: 1 2 3 4 [5] 6 7 8 9 10 11
Run Code Online (Sandbox Code Playgroud)

这就是我想要的结果:

Pages: ... 3 4 [5] 6 7 ...
Run Code Online (Sandbox Code Playgroud)

(在这个例子中,我只显示当前页面的2个相邻页面)

我在PHP/Mysql中实现它,并且"基本"分页(没有trucating)已经编码,我只是在寻找一个优化它的例子......它可以是任何语言的一个例子,只要它给了我一个如何实现它的想法......

cha*_*log 31

我刚才有同样的需要.

这是我用来完成它的文章(使用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

  • 对代码进行一些清理是必要的,但效果很好.+1 (2认同)

Ali*_*xel 15

有点晚了=),但这是我的意思:

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;
}
Run Code Online (Sandbox Code Playgroud)

例:

$total = 1024;
$per_page = 10;
$current_page = 2;
$adjacent_links = 4;

print_r(Pagination($total, $per_page, $current_page, $adjacent_links));
Run Code Online (Sandbox Code Playgroud)

输出(@Codepad):

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Run Code Online (Sandbox Code Playgroud)

另一个例子:

$total = 1024;
$per_page = 10;
$current_page = 42;
$adjacent_links = 4;

print_r(Pagination($total, $per_page, $current_page, $adjacent_links));
Run Code Online (Sandbox Code Playgroud)

输出(@Codepad):

Array
(
    [0] => 40
    [1] => 41
    [2] => 42
    [3] => 43
    [4] => 44
)
Run Code Online (Sandbox Code Playgroud)

  • @Alix Axel不错的回答!! 但更好的实现方式是在最后创建数组,而不是切片预先存在的数组....(例如,如果你有12k页面,那该怎么办) (2认同)

Edw*_*win 8

我从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> ');
}
Run Code Online (Sandbox Code Playgroud)