Php 智能分页算法

Php 智能分页算法,php,pagination,Php,Pagination,我正在寻找智能分页的示例算法。所谓智能,我的意思是,我只想显示,例如,当前页面的两个相邻页面,所以我不会以一个长得离谱的页面列表结束,而是截断它 这里有一个简单的例子让它更清楚。。。这就是我现在拥有的: Pages: 1 2 3 4 [5] 6 7 8 9 10 11 这就是我想要的结局: Pages: ... 3 4 [5] 6 7 ... (在本例中,我仅显示当前页面的两个相邻页面) 我正在用PHP/Mysql实现它,并且“基本”分页(无需说明)已经编码好了,我只是想找一个例子来优化它。

我正在寻找智能分页的示例算法。所谓智能,我的意思是,我只想显示,例如,当前页面的两个相邻页面,所以我不会以一个长得离谱的页面列表结束,而是截断它

这里有一个简单的例子让它更清楚。。。这就是我现在拥有的:

Pages: 1 2 3 4 [5] 6 7 8 9 10 11
这就是我想要的结局:

Pages: ... 3 4 [5] 6 7 ...
(在本例中,我仅显示当前页面的两个相邻页面)


我正在用PHP/Mysql实现它,并且“基本”分页(无需说明)已经编码好了,我只是想找一个例子来优化它。。。它可以是任何语言中的一个例子,只要它给我一个如何实现它的想法…

我刚才也有同样的需要

下面是我用来完成它的文章(使用PHP代码):

它的工作速度非常快,并且在您尝试执行的操作中添加了一些内容,例如:

[1] 2 3 4 5 6 ... 100 1 [2] 3 4 5 6 ... 100 ... 1 ... 4 5 [6] 7 8 ... 100 [1] 2 3 4 5 6 ... 100 1 [2] 3 4 5 6 ... 100 ... 1.4 5 [6] 7 8 ... 100 以下是断开链接的代码:

<?php
    /*
        Place code to connect to your DB here.
    */

    // How many adjacent pages should be shown on each side?
    $adjacents = 3;

    /* 
       First get total number of rows in data table. 
       If you have a WHERE clause in your query, make sure you mirror it here.
    */
    $query = "SELECT COUNT(*) as num FROM portfolio";
    $total_pages = mysql_fetch_array(mysql_query($query));
    $total_pages = $total_pages[num];

    /* Setup vars for query. */
    $limit = 2;                                 //how many items to show per page
    if($page) 
        $start = ($page - 1) * $limit;          //first item to display on this page
    else
        $start = 0;                             //if no page var is given, set start to 0

    /* Get data. */
    $query = "SELECT category, uname, title FROM portfolio LIMIT $start, $limit";
    $portfolio = mysql_query($query);

    /* Setup page vars for display. */
    if ($page == 0) $page = 1;                  //if no page var is given, default to 1.
    $prev = $page - 1;                          //previous page is page - 1
    $next = $page + 1;                          //next page is page + 1
    $lastpage = ceil($total_pages/$limit);      //lastpage is = total pages / items per page, rounded up.
    $lpm1 = $lastpage - 1;                      //last page minus 1

    /* 
        Now we apply our rules and draw the pagination object. 
        We're actually saving the code to a variable in case we want to draw it more than once.
    */
    $pagination = "";
    if($lastpage > 1)
    {   
        $pagination .= "<div class="\"pagination\"">";
        //previous button
        if ($page > 1) 
            $pagination.= "<a href="\"diggstyle.php?page=$prev\"">« previous</a>";
        else
            $pagination.= "<span class="\"disabled\"">« previous</span>";   

        //pages 
        if ($lastpage < 7 + ($adjacents * 2))   //not enough pages to bother breaking it up
        {   
            for ($counter = 1; $counter <= $lastpage; $counter++)
            {
                if ($counter == $page)
                    $pagination.= "<span class="\"current\"">$counter</span>";
                else
                    $pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";                 
            }
        }
        elseif($lastpage > 5 + ($adjacents * 2))    //enough pages to hide some
        {
            //close to beginning; only hide later pages
            if($page < 1 + ($adjacents * 2))        
            {
                for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
                {
                    if ($counter == $page)
                        $pagination.= "<span class="\"current\"">$counter</span>";
                    else
                        $pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";                 
                }
                $pagination.= "...";
                $pagination.= "<a href="\"diggstyle.php?page=$lpm1\"">$lpm1</a>";
                $pagination.= "<a href="\"diggstyle.php?page=$lastpage\"">$lastpage</a>";       
            }
            //in middle; hide some front and some back
            elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
            {
                $pagination.= "<a href="\"diggstyle.php?page=1\"">1</a>";
                $pagination.= "<a href="\"diggstyle.php?page=2\"">2</a>";
                $pagination.= "...";
                for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
                {
                    if ($counter == $page)
                        $pagination.= "<span class="\"current\"">$counter</span>";
                    else
                        $pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";                 
                }
                $pagination.= "...";
                $pagination.= "<a href="\"diggstyle.php?page=$lpm1\"">$lpm1</a>";
                $pagination.= "<a href="\"diggstyle.php?page=$lastpage\"">$lastpage</a>";       
            }
            //close to end; only hide early pages
            else
            {
                $pagination.= "<a href="\"diggstyle.php?page=1\"">1</a>";
                $pagination.= "<a href="\"diggstyle.php?page=2\"">2</a>";
                $pagination.= "...";
                for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
                {
                    if ($counter == $page)
                        $pagination.= "<span class="\"current\"">$counter</span>";
                    else
                        $pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";                 
                }
            }
        }

        //next button
        if ($page < $counter - 1) 
            $pagination.= "<a href="\"diggstyle.php?page=$next\"">next »</a>";
        else
            $pagination.= "<span class="\"disabled\"">next »</span>";
        $pagination.= "</div>\n";       
    }
?>
<ul>
    <?php
        while($item = mysql_fetch_array($portfolio))
        {
    ?>
        <li><a href="/web/20080709045706/http://www.strangerstudios.com/portfolio//"></a></li>
    <?php
        }
    ?>
</ul>
<?=$pagination?>

我会在显示分页器的页面上使用一些简单的东西,比如:

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()case会更好,只是我现在不记得语法了


保持简单:)

不久前,我创建了一个分页类,并加入了谷歌代码。看看吧,这很简单

列表页面=新列表();
int-pn=2//实际页码示例
整数合计=8;
对于(int i=pn-9;i总计)断裂;
第页。添加(i);
}
返回页面;
有点晚了=),但我的目标是:

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));
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));
Array
(
    [0] => 40
    [1] => 41
    [2] => 42
    [3] => 43
    [4] => 44
)
输出():

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

print_r(Pagination($total, $per_page, $current_page, $adjacent_links));
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));
Array
(
    [0] => 40
    [1] => 41
    [2] => 42
    [3] => 43
    [4] => 44
)

另一个例子:

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

print_r(Pagination($total, $per_page, $current_page, $adjacent_links));
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));
Array
(
    [0] => 40
    [1] => 41
    [2] => 42
    [3] => 43
    [4] => 44
)
输出():

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

print_r(Pagination($total, $per_page, $current_page, $adjacent_links));
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));
Array
(
    [0] => 40
    [1] => 41
    [2] => 42
    [3] => 43
    [4] => 44
)

如果可以在客户端上生成分页,我建议使用新的分页插件:

你的问题的解决办法是:

$("#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:';
                }
        }
});
$(“#分页”)。分页(1000,{//您的元素数
格式:'.-nncnn-',//获取页面的格式:…3 4[5]6 7。。。
onSelect:功能(第页){
//添加用户选择页面时执行的代码
},
onFormat:函数(类型){
开关(类型){
大小写“block”://n和c
返回“”+this.value+“”;
案例“填充”://-
返回“…”;
案例“leap”:/。
返回“页面:”;
}
}
});
可以找到-类的代码

(您称之为)智能分页可以通过配置实现

$config['num_links'] = 2;
您希望在测试前后使用的“数字”链接数 所选页码。例如,数字2将放置两位数字 在任意一侧,如本页顶部的示例链接所示


我从lazaro的帖子开始,试图用javascript/jquery制作一个健壮而轻巧的算法。。。 不需要额外和/或庞大的分页库。。。 查看fiddle上的一个实例:

var totalPages=50,按钮=5;
var currentPage=lowerLimit=upperLimit=Math.min(9,totalPages);
//搜索边界
对于(var b=1;b1){lowerLimit--;b++;}
如果(b对于(VarI=lowerLimit;i),除了$result=range(1,intval($data/$limit)),它的效果都很好;而不是$result=range(1,ceil($data/$limit));ceil正在创建一个额外的page@JapanPro:应该是吗?如果您有99个结果,并且希望每页显示10个,则需要
ceil(99/10)=10
pages.@Alix Axel回答得很好!!但是更好的实现应该是在最后创建数组,而不是切片一个预先存在的数组…(例如,如果有12k页怎么办)请参阅我关于上的问题的问题,以便显示您尝试过的代码,而不仅仅是对解决方案的一般要求。请参阅对代码进行一些清理是必要的,但效果非常好+1@changelog链接网站已关闭…第4页的算法错误,例如,当每页的项目数为1,2时,它显示1 2…3 4 5 6。。。20@changelog$adjacents做什么意思是,当我把它改成3的时候,它不会work@changelog谢谢你的链接。我一直在找这个。