/**
*
* 实现思路:分页显示拆分 : 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. Jquery库自带的动画效果方法记录

    1.显示和隐藏hide()和show() <script type="text/javascript">             $(function() {      ...

  2. 关于AutoCAD.NET的辅助方法

    求中点坐标: /// <summary> /// 中点 /// </summary> /// <param name="StartPoint"> ...

  3. JavaScript 面向对象思想 贪吃蛇游戏

    js代码: 游戏的对象 ,食物,蛇 ,游戏控制思路如下 (完整代码在https://github.com/774044859yf/ObjectSnakeGame下载) var snake = { aS ...

  4. aspnetpager分页,不使用存储过程

    一.前台显示界面代码Default.aspx(注意,代码运行环境是VS.2005) <%@ Page Language="C#" AutoEventWireup=" ...

  5. 其实你不懂wget的心-01

    wget用英语定义就是the non-interactive network downloader,翻译过来就是非交互的网络下载器. 1 wget都支持什么协议的下载? wget支持HTTP.HTTP ...

  6. FastRPC 3.2 发布,高性能 C++ 协程 RPC 框架

    用过go erlang gevent的亲们应该都会知道协程在应用中带来的方便. 如果对协程不理解的同学,通过阅读下面例子可以快速了解我们框架的协程的意义,已了解的可以跳过这部分. 协程例子:假设我们要 ...

  7. 倒计时 NAN 问题

    http://blog.csdn.net/lishangua/article/details/51506821

  8. 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?

    转自:  http://apps.hi.baidu.com/share/detail/17798660 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不 ...

  9. poj3507---去掉最小值和最大值

    #include <stdio.h> #include <stdlib.h> int main() { ) { ,max=,min=,t; ; i<; i++) { sc ...

  10. Hibernate 报错:this project is not a myeclipse hibernate project . assuming hibernate 3 cap

    问题描述:  web 项目中 打开 hibernate.cfg.xml 文件时 提示:The project is not a myEclipse hibernate project. 并且:在 db ...