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();