/**
*
* 实现思路:分页显示拆分 : 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分页类及其实现原理的更多相关文章

  1. php分页类代码带分页样式效果(转)

    php分页类代码,有漂亮的分页样式风格 时间:2016-03-16 09:16:03来源:网络 导读:不错的php分页类代码,将类文件与分页样式嵌入,实现php查询结果的精美分页,对研究php分页原理 ...

  2. php+mysql分页类的入门实例

    php+mysql分页类的简单代码 时间:2016-02-25 06:16:26来源:网络 导读:php+mysql分页类的简单代码,二个php分页类代码,对商品进行分页展示,当前页面数,每个页面展示 ...

  3. PHP面向对象(OOP)----分页类

    > 同验证码类,分页也是在个人博客,论坛等网站中不可缺少的方式,通过分页可以在一个界面展示固定条数的数据,而不至于将所有数据全部罗列到一起,实现分页的原理其实就是对数据库查询输出加了一个limi ...

  4. php实现的分页类

    php分页类文件: <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 pr ...

  5. asp.net的快捷实用分页类

    KeleyiPager分页类,可以于对列表页进行分页浏览,代码是从HoverTreeCMS项目中COPY的,感觉很不错,使用简单方便,但是功能强大. 在线体验效果:http://cms.hovertr ...

  6. php分页类

    1.需求 学会php分页类的使用 2.参考例子 CI的分页类 3.代码部分 <?php class pagination{ public $pagesize=20; public $pagein ...

  7. PHPCMS V9 分页类的修改教程

    首先,打开 phpcms\libs\functions\global.func.php 这个文件,找到文件第622行的分页函数,复制一下,粘贴到默认分页函数的下面,重新命名后保存.(笔者在此命名为:p ...

  8. php 简单分页类

    /**  file: page.class.php   完美分页类 Page  */ class Page {  private $total;          //数据表中总记录数  privat ...

  9. PHP简单漂亮的分页类

    本文介绍一款原生的PHP分页类,分页样式有点类似bootstrap. <?php /* * ********************************************* * @类名 ...

随机推荐

  1. C#委托 Lamda表达式

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. 【27前端】base标签带有href属性会让chrome里的svg元素url失效

    一个chrome的问题,但具体原因不明. 触发条件:chrome浏览器base标签里href属性有值的时候 触发问题:svg里面的元素如果有用url的滤镜和模糊,则会失效,在firefox里和IE10 ...

  3. 详解Activity的四种启动模式

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Ac ...

  4. JQuery获取Checkbox组的值

    前台: <div id="addtrtr" style="padding:20px; background-color:#F8F8F8;"> < ...

  5. NOPI 导出excel 通用方法

    public static byte[] ExportExcel<T>(Dictionary<string, string> columnsHeader, List<T& ...

  6. jQuery :lt()选择器

    定义和用法 :lt() 选择器选取 index 值小于指定数字的元素.(不包含指定值) index 值从 0 开始.(从0开始计数) 最常见的用法:与其他选择器一起使用,选取指定组合中特定序号之前的元 ...

  7. JBOSS javax.naming.NameNotFoundException: xxx not bound

    当出现JOBSS部署EJB  xxx not bound 请查看ejb.jar 是否打包完全正常,是不是缺配置文件,一般是缺少配置文件或者打包不正确.

  8. 音量强度转分贝db

    //LPDIRECTSOUNDBUFFER如何设置声音大小?> //取值范围是0 ~ -10000, 0最大,-10000最小,单位是分贝 //0-100音量转换成分贝 double decib ...

  9. 兼容IE6,IE7和firefox可以使用的一些css hack:

    .一些问题是浏览器自身的问题,遇到问题发生无法避免的情况下,那就要考虑使用一些css hack了,以下是针对IE6,IE7和firefox可以使用的一些css hack:(1) a: 针对区别IE6 ...

  10. 【grunt整合版】 30分钟学会使用grunt打包前端代码

    grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...