/**
*
* 实现思路:分页显示拆分 : 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. Zepto.js touch模块深入分析 解决手机点击事件

    源码: // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT li ...

  2. jQuery基础---Ajax基础教程(二)

    jQuery基础---Ajax进阶 内容提纲: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 发文不易,转载请注明出处! 在 Ajax 基础一篇中, ...

  3. VMware虚拟机中调整Linux分区大小手记(转发)

      前段时间用VMware5.5安装了CentOS5.3,安装的时候分配了5Gb的虚拟硬盘空间给Linux系统,系统安装选择很多组件和软件,后面使用时又安装也一些软件,结果导致虚拟硬盘空间不足.查看分 ...

  4. poj3461Oulipo

    Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...

  5. switch 与 whille相互套用

    一直自以为还比较了解C++,这两天写个小工具结果出现了个bug,查了几个小时.现在才发现我这么水. switch是C++后来推出了,目的在于提高代码结构清晰度. 但是switch与while连用时是有 ...

  6. 修改vim默认tab为4个空格与显示行号

    添加一个.vimrc配置文件即可. 在home目录下 vim .vimrc # 添加如下内容 set ts=4 set expandtab set nu 然后再次用vim打开任意文件,就看见效果啦!

  7. 如何在IIS 中配置应用程序(Convert to Application)?

    1.打开IIS 2.选择待操作的虚拟目录 3.鼠标右键,点击"Convert to Application” 4.点击connect as 5.选中Specific user,并点击Set ...

  8. Oracle EBS-SQL (BOM-13):检查未定义库存分的物料类.sql

    select distinct msi.segment1            编码 , msi.description                      描述  , msi.primary_ ...

  9. QueryString和BASE64

    加号(+)是BASE64编码的一部分,而加号在QueryString中被当成是空格.因此,当一个含有BASE64编码的字符串直接作为URL的一部分时,如果其中含有加号,则使用QueryString读取 ...

  10. 好的组件,无须太复杂 – KISSY Slide 组件简介

    KISSY Slide 组件首页:http://gallery.kissyui.com/slide/1.1/guide/index.html V1.1 New Featurs Slide是一个幻灯切换 ...