php分页类及其实现原理

  1 /**
  2  *
  3  * 实现思路:分页显示拆分  :  1...上页 12 13 14 15 [16] 17 18 19 20 ...100 下页
  4  *
  5  * function htmlPart1() : 上页
  6  * function htmlPart2() : 1...
  7  * function htmlPart3() : 12 13 14 15 [16] 17 18 19 20
  8  * function htmlPart4() : ...100
  9  * function htmlPart5() : 下页
 10  *
 11  * @param int $allCount     记录总数目
 12  * @param int $eachPage     每页数目
 13  * @param int $showCount    显示数目
 14  * @param int $thenPage     当前页(页面传值)
 15  * @param string $urlPrefix Url前缀
 16  * @param string $urlSuffix Url后缀
 17  *
 18  * Author : intval@163.com
 19  * Date   : 2013.05.04
 20  *
 21  */
 22 class zPage {
 23 
 24     /** 只可内部调用 */
 25     private $allCount;  /** 总数(非总页数) */
 26     private $eachPage;  /** 每页数(分页数) */
 27     private $showCount; /** 显示数(显示多少页数) */
 28     private $urlPrefix; /** 页码前缀(例如:?page=) */
 29     private $urlSuffix; /** 页码后缀缀(例如:&type=1) */
 30     private $startHide; /** 计算前部需要出现符号(...)的最小值 */
 31     private $endHide;   /** 计算尾部需要出现符号(...)的最小值 */
 32     private $arrTxt = array(' ', ' '); // array('上页', '上页')
 33 
 34     /** 可外部调用 */
 35     public $allPage;    /** 总页数 */
 36     public $thenPage;   /** 当前页 */
 37 
 38     public function __construct($allCount, $eachPage, $showCount, $thenPage, $urlPrefix = '?page=', $urlSuffix = '') {
 39 
 40         $this->allCount = intval($allCount);
 41         $this->eachPage = intval($eachPage);
 42         $this->showCount = intval($showCount);
 43         $this->urlPrefix = trim($urlPrefix);
 44         $this->urlSuffix = trim($urlSuffix);
 45 
 46         /** 计算总页数 */
 47         $this->allPage = ceil($this->allCount / $this->eachPage);
 48 
 49         /** 使当前页的数值合法化 */
 50         $this->thenPage = max(intval($thenPage), 1);
 51         $this->thenPage >= $this->allPage AND $this->thenPage = $this->allPage;
 52 
 53         /** 计算前部和尾部需要出现符号(...)的最小值 */
 54         $this->startHide = ceil($this->showCount / 2);
 55         $this->endHide = $this->allPage - $this->startHide;
 56     }
 57 
 58     public function parseUrl($char = '') {
 59 
 60         $val = $char;
 61         ($char === 'prev') AND $val = $this->thenPage - 1;
 62         ($char === 'next') AND $val = $this->thenPage + 1;
 63         ($char === '') AND $val = $this->allPage;
 64         return $this->urlPrefix . $val . $this->urlSuffix;
 65     }
 66 
 67     public function htmlPart1() {
 68 
 69         $html = '';
 70         $this->thenPage > $this->startHide AND $html = '<a class="prev" href="' . $this->parseUrl('prev') . '" title="上一页">' . $this->arrTxt[0] . '</a>' . PHP_EOL;
 71         return $html;
 72     }
 73 
 74     public function htmlPart2() {
 75 
 76         $dot = '';
 77         $this->thenPage > $this->startHide AND $dot = ' ...';
 78 
 79         $html = '<a href="' . $this->parseUrl(1) . '">1'. $dot .'</a>' . PHP_EOL;
 80         $this->thenPage == 1 AND $html = '<span>1</span>' . PHP_EOL;
 81 
 82         return $html;
 83     }
 84 
 85     public function htmlPart3() {
 86 
 87         $html = '';
 88 
 89         if ($this->thenPage <= $this->startHide) {
 90 
 91             /**
 92              * 第一种情况:[1] 2 3 4 5 6 7 8 9 10 ...100 下页
 93              * 即:当前部在 不需要出现...的 范围之内
 94              */
 95             for ($i = 2, $n = $this->showCount; $i < $n; $i++) {
 96                 $html .= (($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>') . PHP_EOL;
 97             }
 98 
 99         } elseif ($this->thenPage >= $this->endHide) {
100 
101             /**
102              * 第二种情况:上页 1..92 93 94 95 96 97 98 [99] 100
103              * 即:当尾部在 不需要出现...的 范围之内
104              */
105             $len = $this->showCount - 2;
106             $i = $this->allPage - $len;
107             $n = $this->allPage;
108             for ($i; $i < $n; $i++) {
109                 $html .= (($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>') . PHP_EOL;
110             }
111 
112         } else {
113 
114             /**
115              * 第三种情况:上页 1..12 13 14 15 [16] 17 18 19 20 ...100 下页
116              * 即:当前后都在 需要出现...的 范围之内
117              */
118             $len = $this->showCount - 2;    // 此处减去2,是说明头尾各占去一个数字(1, x)
119             $offset = ceil($len / 2) - 1;   // 对剩下的数目平分,得出平分数
120             $i = $this->thenPage - $offset; // 循环开始:当前页向前偏移平分数
121             $n = $this->thenPage + $offset; // 循环结束:当前页向后偏移平分数
122             for ($i; $i <= $n; $i++) {
123                 $html .= (($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>') . PHP_EOL;
124             }
125         }
126 
127         return $html;
128     }
129 
130     public function htmlPart4() {
131 
132         $dot = '';
133         $this->thenPage < $this->endHide AND $dot = '... ';
134 
135         $html = '<a href="' . $this->parseUrl() . '">' . $dot . $this->allPage . '</a>' . PHP_EOL;
136         $this->thenPage == $this->allPage AND $html = '<span>' . $this->allPage . '</span>' . PHP_EOL;
137 
138         return $html;
139     }
140 
141     public function htmlPart5() {
142 
143         $html = '';
144         $this->thenPage < $this->endHide AND $html = '<a class="next" href="' . $this->parseUrl('next') . '" title="下一页">' . $this->arrTxt[1] . '</a>' . PHP_EOL;
145         return $html;
146     }
147 
148     public function html() {
149 
150         $pageHtml = '';
151 
152         /** 总页数未达到显示页码数,则全部显示 */
153         if ($this->allPage <= $this->showCount) {
154             for ($i = 1; $i <= $this->allPage; $i++) {
155                 $pageHtml .= ($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' . PHP_EOL : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>' . PHP_EOL;
156             }
157         } else {
158             $pageHtml = $this->htmlPart2() . $this->htmlPart1() . $this->htmlPart3() . $this->htmlPart4() . $this->htmlPart5();
159         }
160 
161         return $pageHtml;
162     }
163 }
164 
165 // 调用例子
166 $getPage = isset($_GET['page']) ? intval($_GET['page']) : 0;
167 $getPage = max($getPage, 1);
168 $zPage = new zPage(1100, 10, 11, $getPage, '?page=', '&type=1');
169 echo $zPage->html();

 

posted @ 2014-02-28 18:52  再見理想  阅读(483)  评论(0编辑  收藏  举报