function getpagerange($currentpage, $totalpages, $displaysize = 10) {
if ($totalpages return array();
} elseif ($displaysize > $totalpages) {
$startpage = 1;
$endpage = $totalpages;
} else {
if ($currentpage % $displaysize === 0) {
$startpage = $currentpage - $displaysize + 1;
} else {
while (($currentpage % $displaysize)) {
--$currentpage;
}
$startpage = $currentpage + 1;
}
if ($startpage $startpage = 1;
}
$endpage = $startpage + $displaysize - 1;
if ($endpage > $totalpages) {
$endpage = $totalpages;
$startpage = $endpage - $displaysize + 1;
}
}
return range($startpage, $endpage);
}php?name=%ba%af%ca%fd">函数getpagerange接受三个参数,当前页$currentpage,总页数$totalpages,和翻页区间长度$displaysize,默认是10。根据这三个参数,函数getpagerange会生成一个适当的包含了$currentpage的翻页区间。首先,我们需要排除非法的参数值,对于总页数或区间长度小于零的情况,须加以检查。
然后,我们考察静态划分的思路。如前所述,给定翻页区间长度后,便可用总页数除以长度,得到区间个数。与此同时,我们可分析得知并不是所有区间都含有相同的页数,在极端情况下,还会出现总页数小于给定的翻页区间长度,那么划分或切割的结果将永远只有一个区间。幸运的是,这不会给我们的核心算法带来什么干扰,但我们仍须重视代码的健壮性。所以,我们先考虑极端情况,在运用算法解决核心问题之前,先迅速捕捉只有一页的区间。
接下来,我们便可以看看区间的固有属性了。每个动态切割的区间,都有一个起始页和一个尾页;由于区间彼此存在先后顺序,所以在经过静态划分后,我们始终会得到第一个(首)区间和最后一个(尾)区间,若首尾区间重合,则说明总页数小于给定的翻页区间长度。无论如何,算法需要解决的关键问题是如何找到区间的起始页和尾页,一旦确定这两个元素,便可以使用php内置的range函数生成区间内的全部页码。
算法利用当前页$currentpage和翻页区间长度$displaysize做比较,来判断当前页在区间内所处的位置,进而推导出区间起始页和尾页与当前页的偏移量。为了做到完美无缺,我们还要考虑边界溢出的问题,这也非常简单,只需判断起始页和尾页是否介于1和总页数之间即可。
至此,对于代码的分析已经完成。我们来看一下算法的时间效率,通俗地说,算法中的基本操作是求模,算法的执行时间取决于$currentpage与$displaysize的差值,差值越大,则求模次数越多、执行时间越长,呈线性结构。而实际的执行结果则是在瞬间完成的。
下面,我们来结合上面的google搜索结果页,利用getpagerange函数生成一个翻页区间,输入所需参数:
print_r(implode(',', getpagerange(18, 27, 20)));得到的结果是:
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20大家会发现这和google搜索结果页显示的完全不一样。对,因为google的翻页区间把当前页强制设置在中间位置上了!嗯,不要灰心,我们仍可以利用getpagerange函数得到与之相匹配的结果,只需把问题再分解一下:
print_r(implode(',', array_merge(getpagerange(17, 17, 10), getpagerange(27, 27, 10))));得到的结果是:
8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号