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谢谢你的链接。我一直在找这个。