php分页类及其实现原理
/**
*
* 实现思路:分页显示拆分 : 1...上页 12 13 14 15 [16] 17 18 19 20 ...100 下页
*
* function htmlPart1() : 上页
* function htmlPart2() : 1...
* function htmlPart3() : 12 13 14 15 [16] 17 18 19 20
* function htmlPart4() : ...100
* function htmlPart5() : 下页
*
* @param int $allCount 记录总数目
* @param int $eachPage 每页数目
* @param int $showCount 显示数目
* @param int $thenPage 当前页(页面传值)
* @param string $urlPrefix Url前缀
* @param string $urlSuffix Url后缀
*
* Author : intval@163.com
* Date : 2013.05.04
*
*/
class zPage { /** 只可内部调用 */
private $allCount; /** 总数(非总页数) */
private $eachPage; /** 每页数(分页数) */
private $showCount; /** 显示数(显示多少页数) */
private $urlPrefix; /** 页码前缀(例如:?page=) */
private $urlSuffix; /** 页码后缀缀(例如:&type=1) */
private $startHide; /** 计算前部需要出现符号(...)的最小值 */
private $endHide; /** 计算尾部需要出现符号(...)的最小值 */
private $arrTxt = array(' ', ' '); // array('上页', '上页') /** 可外部调用 */
public $allPage; /** 总页数 */
public $thenPage; /** 当前页 */ public function __construct($allCount, $eachPage, $showCount, $thenPage, $urlPrefix = '?page=', $urlSuffix = '') { $this->allCount = intval($allCount);
$this->eachPage = intval($eachPage);
$this->showCount = intval($showCount);
$this->urlPrefix = trim($urlPrefix);
$this->urlSuffix = trim($urlSuffix); /** 计算总页数 */
$this->allPage = ceil($this->allCount / $this->eachPage); /** 使当前页的数值合法化 */
$this->thenPage = max(intval($thenPage), 1);
$this->thenPage >= $this->allPage AND $this->thenPage = $this->allPage; /** 计算前部和尾部需要出现符号(...)的最小值 */
$this->startHide = ceil($this->showCount / 2);
$this->endHide = $this->allPage - $this->startHide;
} public function parseUrl($char = '') { $val = $char;
($char === 'prev') AND $val = $this->thenPage - 1;
($char === 'next') AND $val = $this->thenPage + 1;
($char === '') AND $val = $this->allPage;
return $this->urlPrefix . $val . $this->urlSuffix;
} public function htmlPart1() { $html = '';
$this->thenPage > $this->startHide AND $html = '<a class="prev" href="' . $this->parseUrl('prev') . '" title="上一页">' . $this->arrTxt[0] . '</a>' . PHP_EOL;
return $html;
} public function htmlPart2() { $dot = '';
$this->thenPage > $this->startHide AND $dot = ' ...'; $html = '<a href="' . $this->parseUrl(1) . '">1'. $dot .'</a>' . PHP_EOL;
$this->thenPage == 1 AND $html = '<span>1</span>' . PHP_EOL; return $html;
} public function htmlPart3() { $html = ''; if ($this->thenPage <= $this->startHide) { /**
* 第一种情况:[1] 2 3 4 5 6 7 8 9 10 ...100 下页
* 即:当前部在 不需要出现...的 范围之内
*/
for ($i = 2, $n = $this->showCount; $i < $n; $i++) {
$html .= (($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>') . PHP_EOL;
} } elseif ($this->thenPage >= $this->endHide) { /**
* 第二种情况:上页 1..92 93 94 95 96 97 98 [99] 100
* 即:当尾部在 不需要出现...的 范围之内
*/
$len = $this->showCount - 2;
$i = $this->allPage - $len;
$n = $this->allPage;
for ($i; $i < $n; $i++) {
$html .= (($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>') . PHP_EOL;
} } else { /**
* 第三种情况:上页 1..12 13 14 15 [16] 17 18 19 20 ...100 下页
* 即:当前后都在 需要出现...的 范围之内
*/
$len = $this->showCount - 2; // 此处减去2,是说明头尾各占去一个数字(1, x)
$offset = ceil($len / 2) - 1; // 对剩下的数目平分,得出平分数
$i = $this->thenPage - $offset; // 循环开始:当前页向前偏移平分数
$n = $this->thenPage + $offset; // 循环结束:当前页向后偏移平分数
for ($i; $i <= $n; $i++) {
$html .= (($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>') . PHP_EOL;
}
} return $html;
} public function htmlPart4() { $dot = '';
$this->thenPage < $this->endHide AND $dot = '... '; $html = '<a href="' . $this->parseUrl() . '">' . $dot . $this->allPage . '</a>' . PHP_EOL;
$this->thenPage == $this->allPage AND $html = '<span>' . $this->allPage . '</span>' . PHP_EOL; return $html;
} public function htmlPart5() { $html = '';
$this->thenPage < $this->endHide AND $html = '<a class="next" href="' . $this->parseUrl('next') . '" title="下一页">' . $this->arrTxt[1] . '</a>' . PHP_EOL;
return $html;
} public function html() { $pageHtml = ''; /** 总页数未达到显示页码数,则全部显示 */
if ($this->allPage <= $this->showCount) {
for ($i = 1; $i <= $this->allPage; $i++) {
$pageHtml .= ($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' . PHP_EOL : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>' . PHP_EOL;
}
} else {
$pageHtml = $this->htmlPart2() . $this->htmlPart1() . $this->htmlPart3() . $this->htmlPart4() . $this->htmlPart5();
} return $pageHtml;
}
} // 调用例子
$getPage = isset($_GET['page']) ? intval($_GET['page']) : 0;
$getPage = max($getPage, 1);
$zPage = new zPage(1100, 10, 11, $getPage, '?page=', '&type=1');
echo $zPage->html();
php分页类及其实现原理的更多相关文章
- php分页类代码带分页样式效果(转)
php分页类代码,有漂亮的分页样式风格 时间:2016-03-16 09:16:03来源:网络 导读:不错的php分页类代码,将类文件与分页样式嵌入,实现php查询结果的精美分页,对研究php分页原理 ...
- php+mysql分页类的入门实例
php+mysql分页类的简单代码 时间:2016-02-25 06:16:26来源:网络 导读:php+mysql分页类的简单代码,二个php分页类代码,对商品进行分页展示,当前页面数,每个页面展示 ...
- PHP面向对象(OOP)----分页类
> 同验证码类,分页也是在个人博客,论坛等网站中不可缺少的方式,通过分页可以在一个界面展示固定条数的数据,而不至于将所有数据全部罗列到一起,实现分页的原理其实就是对数据库查询输出加了一个limi ...
- php实现的分页类
php分页类文件: <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 pr ...
- asp.net的快捷实用分页类
KeleyiPager分页类,可以于对列表页进行分页浏览,代码是从HoverTreeCMS项目中COPY的,感觉很不错,使用简单方便,但是功能强大. 在线体验效果:http://cms.hovertr ...
- php分页类
1.需求 学会php分页类的使用 2.参考例子 CI的分页类 3.代码部分 <?php class pagination{ public $pagesize=20; public $pagein ...
- PHPCMS V9 分页类的修改教程
首先,打开 phpcms\libs\functions\global.func.php 这个文件,找到文件第622行的分页函数,复制一下,粘贴到默认分页函数的下面,重新命名后保存.(笔者在此命名为:p ...
- php 简单分页类
/** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 privat ...
- PHP简单漂亮的分页类
本文介绍一款原生的PHP分页类,分页样式有点类似bootstrap. <?php /* * ********************************************* * @类名 ...
随机推荐
- %1 不是有效的 Win32 应用程序
客户环境windows server 2008,iis 6.0. 站点配置与以往并无差别,更新类库后出现“%1 不是有效的 Win32 应用程序”错误,如下图: 系统登录页面可以正常加载,登录过程中出 ...
- Redis系列整理
0.Redis系列-安装部署维护篇 1.Redis系列-远程连接redis并给redis加锁 2.Redis系列-存储篇string主要操作函数小结 3.Redis系列-存储篇list主要操作函数小结 ...
- 用GoEasy推送实现Java实时推送
前段时间客户有个需求他希望他在后台管理页面发布一个消息,所有用这个系统的用户无论在哪个页面都能及时收到他发布的信息,以前对于类似需求在少量 页面接收的前提下,我一般采用ajax定时去服务器pull信息 ...
- C语言_double_精度的谜团
double-long long 和0的比较,double和double之间比较
- python正则表达式基础篇
1.正则表达式基础 1.1简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大 ...
- jquery.session.js使用
// jquery.session.js 简单使用方法 添加数据 $.session.set('key', 'value') 删除数据 $.session.remove('key'); 获 ...
- html 中head显示 在标题栏里面的图片
在<head>标签里加<link rel="Shortcut Icon" href="你的ico图片地址" /> 一般标题栏里的图片是1 ...
- RoHS认证简介
RoHS认证是<电气.电子设备中限制使用某些有害物质指令>(The restriction of the use of certain hazardous substances in el ...
- 【Itext】7步制作Itext5页眉页脚pdf实现第几页共几页
itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标 鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类 ...
- perl 对象 bless 引用
[root@dr-mysql01 ~]# cat aa.pl use LWP::UserAgent; use Data::Dumper; my $ua = LWP::UserAgent->new ...