总条数为:$total
每页条数为:$perpage
当前页:$page
总页数为:$cnt =ceil($total/$perpage)向上取整
第$page页,
前面已经有$page-1页,每页显示$perpage条
已经跳过($page-1)*$perpage条
即从($page-1)*$perpage+1开始取,再取出$perpage条
分页导航:
根据总页数,生成页码:
在page导航中,根据页码来生成,同时不能把其他参数丢失
因此需要把地址栏的参数获取,并保存起来
<?php defined('ACC')||exit('Acc Denied'); class PageTool { protected $total = 0;//总条数 protected $perpage = 10;//每一页的条数 protected $page = 1;//当前的页码 public function __construct($total,$page=false,$perpage=false) { $this->total = $total; if($perpage) { //没有传递默认10 $this->perpage = $perpage; } if($page) { //当前页没传默认 1 $this->page = $page; } } // 主要函数,创建分页导航 public function show() { $cnt = ceil($this->total/$this->perpage);// 得到总页数 /*获取当前页面 URI 用来指定要访问的页面*/ $uri = $_SERVER['REQUEST_URI']; /*parse_url —解析 URL,返回其组成部分 $url='http://username:password@hostname/path?arg=value#anchor' ; print_r ( parse_url ( $url )); Array ( [scheme] => http [host] => hostname [user] => username [pass] => password [path] => /path [query] => arg=value [fragment] => anchor ) */ $parse = parse_url($uri); /*将字符串解析成多个变量*/ $param = array(); if(isset($parse['query'])) { parse_str($parse['query'],$param); } // 不管$param数组里,有没有page单元,都unset一下,确保没有page单元, // 即保存除page之外的所有单元 unset($param['page']); $url = $parse['path'] . '?'; if(!empty($param)) { /*http_build_query 生成 URL-encode 之后的请求字符串 */ $param = http_build_query($param); $url = $url . $param . '&'; } // 下一个关键,就是计算页码导航 $nav = array(); $nav[0] = '<span>' . $this->page . '</span>'; for($left = $this->page-1,$right=$this->page+1;($left>=1||$right<=$cnt)&&count($nav) <= 5;) { if($left >= 1) { array_unshift($nav,'<a href="' . $url . 'page=' . $left . '">[' . $left . ']</a>'); $left -= 1; } if($right <= $cnt) { array_push($nav,'<a href="' . $url . 'page=' . $right . '">[' . $right . ']</a>'); $right += 1; } } return implode('',$nav); } } /*分页类调用测试 new pagetool(总条数,当前页,每页条数); show() 返回分页代码. */ /*$page = $_GET['page']?$_GET['page']:1; $p = new PageTool(120,$page,6); echo $p->show();*/ |