求一个PHP分页类 php分页 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转一个Laruence博客里的首先,要获取总页面数是多少:$total_page = ceil($total/$page_size);这样的写法是不是更简单一些呢?其次,我是这样想的, 这个需求最高的需求是要根据当前的页码,找出size个页码数来。那么就可以转化为: 根据当前的信息, 填充一个size个元素的数组。最终就可以简单的转化为:根据当前的信息,寻找出size个元素的数组的起始元素是什么?我们假设这个起始元素是:page_start;$page_start = 1;$half = intval($size/2);$page_start = max(1, $page - $half);$page_end = min($page_start + $size - 1, $total_page);$page_start = max(1, $page_end - $size + 1);这样写,是不是也很有技巧呢?最后就简单了, 根据起始页和结束页, 生成一个数组, 最后foreach这个数组,生成html代码:$page_numbers = range($page_start, $page_end);$nav_str = "";foreach($page_numbers as $num){ //.......}源码:/** *A pagination generation class *@class : Pagination *@version: 1.0.0 *@author : huixinchen at baidu.com *@useage: * $pagi = new Pagination($url_prefix, $page_size, $mesgs_count, $pagination_size=10, array $conf); * $navigation_str = $pagi->generate($current_page_number); */class Pagination{ private $page, $total_page, $total, $page_size, $size; private $prev_str = "<", $next_str = ">"; private $class, $selected_class = "selected", $prev_class="prev", $next_class="next", $de_prev_class="de_prev", $de_next_class="de_next"; private $url_prefix="", $split_char="?"; private $para_name = "page", $target = ""; public function Pagination($url_prefix, $page_size, $total, $size=10, $conf=array()){ $this->page = 1; $this->page_size = $page_size; $this->total = $total; $this->total_page = intval(ceil($total/$page_size)); $this->size = $size; if(!empty($conf)){ $configure = array("prev_str", "next_str", "class", "selected_class"); foreach($conf as $key => $val){ if(in_array($key, $configure)){ $this->$val = $val; } } } $this->url_prefix = $url_prefix; if(strstr($url_prefix, '?') !== false){ $this->url_prefix .= "&" . $this->para_name . "="; }else{ $this->url_prefix .= "?" . $this->para_name . "="; } } public function generate($page){ $this->page = $page; if(isset($this->page[$page])){ return $this->page_str[$page]; } $page_start = 1; $half = intval($this->size/2); $page_start = max(1, $page - $half); $page_end = min($page_start + $this->size - 1, $this->total_page); $page_start = max(1, $page_end - $this->size + 1); $this->page_str[$page] = $this->build_nav_str($page_start, $page_end); return $this->page_str[$page]; } private function build_nav_str($page_start, $page_end){ $page_nums = range($page_start, $page_end); $target = $this->target? " target=\"{$this->target}\"" : ""; if($this->page == 1){ $page_str = <<<HTML <span class="{$this->de_prev_class}"> {$this->prev_str} </span>HTML; }else{ $page = $this->page - 1; $page_str = <<<HTML <span class="{$this->prev_class}"> <a href="{$this->url_prefix}{$page}"{$this->target}>{$this->prev_str}</a></span>HTML; } foreach($page_nums as $p){ $page_str .= ($p == $this->page) ? <<<HTML <span class="{$this->selected_class}">{$p}</span>HTML : <<<HTML <span class="{$this->class}"><a href="{$this->url_prefix}{$p}"{$this->target}>{$p}</a></span>HTML; } if($this->page == $this->total_page){ $page_str .= <<<HTML <span class="{$this->de_next_class}"> {$this->next_str} </span>HTML; }else{ $page = $this->page + 1; $page_str .= <<<HTML <span class="{$this->next_class}"> <a href="{$this->url_prefix}{$page}"{$this->target}>{$this->next_str}</a></span>HTML; } return $page_str; } public function tidy_str(){ ;//void } public function __call($func_name, $arguments){ if(isset($this->$func_name)){ return $this->$func_name; } } public function __destruct(){ unset($this->page_str); unset($this); }} class Pagination { private $total; //数据表中总记录数 private $listRows; //每页显示行数 private $limit; private $uri; private $pageNum; //页数 private $config=array('header'=>"个记录", "prev"=>"上一页", "next"=>"下一页", "first"=>"首 页", "last"=>"尾 页"); private $listNum=8; /* * $total * $listRows */ public function __construct($total, $listRows=10, $pa=""){ $this->total=$total; //信息总条数 $this->listRows=$listRows; //每页显示条数 $this->uri=$this->getUri($pa); $this->page=!empty($_GET["page"]) ? $_GET["page"] : 1; $this->pageNum=ceil($this->total/$this->listRows); //总页数 $this->limit=$this->setLimit(); } private function setLimit(){ return "Limit ".($this->page-1)*$this->listRows.", {$this->listRows}"; } private function getUri($pa){ $url=$_SERVER["REQUEST_URI"].(strpos($_SERVER["REQUEST_URI"], '?')?'':"?").$pa; $parse=parse_url($url); if(isset($parse["query"])){ parse_str($parse['query'],$params); unset($params["page"]); $url=$parse['path'].'?'.http_build_query($params); } return $url; } public function __get($args){ if($args=="limit") return $this->limit; else return null; } private function start(){ if($this->total==0) return 0; else return ($this->page-1)*$this->listRows+1; } private function end(){ return min($this->page*$this->listRows,$this->total); } private function first(){ if($this->page==1) $html.=''; else $html.=" <a href='javascript:setPage(\"{$this->uri}&page=1\")'>{$this->config["first"]}</a> "; return $html; } private function prev(){ if($this->page==1) $html.=''; else $html.=" <a href='javascript:setPage(\"{$this->uri}&page=".($this->page-1)."\")'>{$this->config["prev"]}</a> "; return $html; } private function pageList(){ $linkPage=""; $inum=floor($this->listNum/2); for($i=$inum; $i>=1; $i--){ $page=$this->page-$i; if($page<1) continue; $linkPage.=" <a href='javascript:setPage(\"{$this->uri}&page={$page}\")'>{$page}</a> "; } $linkPage.=" {$this->page} "; for($i=1; $i<=$inum; $i++){ $page=$this->page+$i; if($page<=$this->pageNum) $linkPage.=" <a href='javascript:setPage(\"{$this->uri}&page={$page}\")'>{$page}</a> "; else break; } return $linkPage; } private function next(){ if($this->page==$this->pageNum) $html.=''; else $html.=" <a href='javascript:setPage(\"{$this->uri}&page=".($this->page+1)."\")'>{$this->config["next"]}</a> "; return $html; } private function last(){ if($this->page==$this->pageNum) $html.=''; else $html.=" <a href='javascript:setPage(\"{$this->uri}&page=".($this->pageNum)."\")'>{$this->config["last"]}</a> "; return $html; } private function goPage(){ return ' <input type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;setPage(\''.$this->uri.'&page=\'+page+\'\')}" value="'.$this->page.'" style="width:25px"><input type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;setPage(\''.$this->uri.'&page=\'+page+\'\')"> '; } function fpage($display=array(0,1,2,3,4,5,6,7,8)){ $html[0]=" 共有<b>{$this->total}</b>{$this->config["header"]} "; $html[1]=" 每页显示<b>".($this->end()-$this->start()+1)."</b>条,本页<b>{$this->start()}-{$this->end()}</b>条 "; $html[2]=" <b>{$this->page}/{$this->pageNum}</b>页 "; $html[3]=$this->first(); $html[4]=$this->prev(); $html[5]=$this->pageList(); $html[6]=$this->next(); $html[7]=$this->last(); $html[8]=$this->goPage(); $fpage=''; foreach($display as $index){ $fpage.=$html[$index]; } return $fpage; } } 关于页面显示数据库内容的问题,急急急 PHP删除替换指定整行的内容 phpmailer发邮件失败,是什么原因? ZendFrameWork创建文件夹问题 这个SQL语句怎么写啊? 怎么让一个<input type=image>触发一个function? inndb类型的表如何启用事务? 1000分找bbs/forum源码 大家给个建议,图片放在数据库中好,还是单独以文件保存好? php 留言功能 搭建Apache+PHP出错,求解,感激不尽 新手请教,php+apache访问本地网页的问题
其次,我是这样想的, 这个需求最高的需求是要根据当前的页码,找出size个页码数来。
那么就可以转化为: 根据当前的信息, 填充一个size个元素的数组。
最终就可以简单的转化为:根据当前的信息,寻找出size个元素的数组的起始元素是什么?我们假设这个起始元素是:page_start;$page_start = 1;
$half = intval($size/2);
$page_start = max(1, $page - $half);
$page_end = min($page_start + $size - 1, $total_page);
$page_start = max(1, $page_end - $size + 1);这样写,是不是也很有技巧呢?最后就简单了, 根据起始页和结束页, 生成一个数组, 最后foreach这个数组,生成html代码:$page_numbers = range($page_start, $page_end);
$nav_str = "";
foreach($page_numbers as $num){
//.......
}源码:/**
*A pagination generation class
*@class : Pagination
*@version: 1.0.0
*@author : huixinchen at baidu.com
*@useage:
* $pagi = new Pagination($url_prefix, $page_size, $mesgs_count, $pagination_size=10, array $conf);
* $navigation_str = $pagi->generate($current_page_number);
*/
class Pagination{
private $page, $total_page, $total, $page_size, $size;
private $prev_str = "<", $next_str = ">";
private $class, $selected_class = "selected", $prev_class="prev", $next_class="next",
$de_prev_class="de_prev", $de_next_class="de_next";
private $url_prefix="", $split_char="?";
private $para_name = "page", $target = "";
public function Pagination($url_prefix, $page_size, $total, $size=10, $conf=array()){
$this->page = 1;
$this->page_size = $page_size;
$this->total = $total;
$this->total_page = intval(ceil($total/$page_size));
$this->size = $size;
if(!empty($conf)){
$configure = array("prev_str", "next_str", "class", "selected_class");
foreach($conf as $key => $val){
if(in_array($key, $configure)){
$this->$val = $val;
}
}
}
$this->url_prefix = $url_prefix;
if(strstr($url_prefix, '?') !== false){
$this->url_prefix .= "&" . $this->para_name . "=";
}else{
$this->url_prefix .= "?" . $this->para_name . "=";
}
}
public function generate($page){
$this->page = $page;
if(isset($this->page[$page])){
return $this->page_str[$page];
}
$page_start = 1;
$half = intval($this->size/2);
$page_start = max(1, $page - $half);
$page_end = min($page_start + $this->size - 1, $this->total_page);
$page_start = max(1, $page_end - $this->size + 1);
$this->page_str[$page] = $this->build_nav_str($page_start, $page_end);
return $this->page_str[$page];
}
private function build_nav_str($page_start, $page_end){
$page_nums = range($page_start, $page_end);
$target = $this->target? " target=\"{$this->target}\"" : "";
if($this->page == 1){
$page_str = <<<HTML
<span class="{$this->de_prev_class}"> {$this->prev_str} </span>
HTML;
}else{
$page = $this->page - 1;
$page_str = <<<HTML
<span class="{$this->prev_class}"> <a href="{$this->url_prefix}{$page}"{$this->target}>{$this->prev_str}</a></span>
HTML;
}
foreach($page_nums as $p){
$page_str .= ($p == $this->page) ? <<<HTML
<span class="{$this->selected_class}">{$p}</span>
HTML
: <<<HTML
<span class="{$this->class}"><a href="{$this->url_prefix}{$p}"{$this->target}>{$p}</a></span>
HTML;
}
if($this->page == $this->total_page){
$page_str .= <<<HTML
<span class="{$this->de_next_class}"> {$this->next_str} </span>
HTML;
}else{
$page = $this->page + 1;
$page_str .= <<<HTML
<span class="{$this->next_class}"> <a href="{$this->url_prefix}{$page}"{$this->target}>{$this->next_str}</a></span>
HTML;
}
return $page_str;
}
public function tidy_str(){
;//void
}
public function __call($func_name, $arguments){
if(isset($this->$func_name)){
return $this->$func_name;
}
}
public function __destruct(){
unset($this->page_str);
unset($this);
}
}
private $total; //数据表中总记录数
private $listRows; //每页显示行数
private $limit;
private $uri;
private $pageNum; //页数
private $config=array('header'=>"个记录", "prev"=>"上一页", "next"=>"下一页", "first"=>"首 页", "last"=>"尾 页");
private $listNum=8;
/*
* $total
* $listRows
*/
public function __construct($total, $listRows=10, $pa=""){
$this->total=$total; //信息总条数
$this->listRows=$listRows; //每页显示条数
$this->uri=$this->getUri($pa);
$this->page=!empty($_GET["page"]) ? $_GET["page"] : 1;
$this->pageNum=ceil($this->total/$this->listRows); //总页数
$this->limit=$this->setLimit();
} private function setLimit(){
return "Limit ".($this->page-1)*$this->listRows.", {$this->listRows}";
} private function getUri($pa){
$url=$_SERVER["REQUEST_URI"].(strpos($_SERVER["REQUEST_URI"], '?')?'':"?").$pa; $parse=parse_url($url); if(isset($parse["query"])){
parse_str($parse['query'],$params);
unset($params["page"]);
$url=$parse['path'].'?'.http_build_query($params);
} return $url;
} public function __get($args){
if($args=="limit")
return $this->limit;
else
return null;
} private function start(){
if($this->total==0)
return 0;
else
return ($this->page-1)*$this->listRows+1;
} private function end(){
return min($this->page*$this->listRows,$this->total);
} private function first(){
if($this->page==1)
$html.='';
else
$html.=" <a href='javascript:setPage(\"{$this->uri}&page=1\")'>{$this->config["first"]}</a> "; return $html;
} private function prev(){
if($this->page==1)
$html.='';
else
$html.=" <a href='javascript:setPage(\"{$this->uri}&page=".($this->page-1)."\")'>{$this->config["prev"]}</a> "; return $html;
} private function pageList(){
$linkPage="";
$inum=floor($this->listNum/2);
for($i=$inum; $i>=1; $i--){
$page=$this->page-$i; if($page<1)
continue; $linkPage.=" <a href='javascript:setPage(\"{$this->uri}&page={$page}\")'>{$page}</a> "; }
$linkPage.=" {$this->page} ";
for($i=1; $i<=$inum; $i++){
$page=$this->page+$i;
if($page<=$this->pageNum)
$linkPage.=" <a href='javascript:setPage(\"{$this->uri}&page={$page}\")'>{$page}</a> ";
else
break;
} return $linkPage;
} private function next(){
if($this->page==$this->pageNum)
$html.='';
else
$html.=" <a href='javascript:setPage(\"{$this->uri}&page=".($this->page+1)."\")'>{$this->config["next"]}</a> "; return $html;
} private function last(){
if($this->page==$this->pageNum)
$html.='';
else
$html.=" <a href='javascript:setPage(\"{$this->uri}&page=".($this->pageNum)."\")'>{$this->config["last"]}</a> "; return $html;
} private function goPage(){
return ' <input type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;setPage(\''.$this->uri.'&page=\'+page+\'\')}" value="'.$this->page.'" style="width:25px"><input type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;setPage(\''.$this->uri.'&page=\'+page+\'\')"> ';
}
function fpage($display=array(0,1,2,3,4,5,6,7,8)){
$html[0]=" 共有<b>{$this->total}</b>{$this->config["header"]} ";
$html[1]=" 每页显示<b>".($this->end()-$this->start()+1)."</b>条,本页<b>{$this->start()}-{$this->end()}</b>条 ";
$html[2]=" <b>{$this->page}/{$this->pageNum}</b>页 ";
$html[3]=$this->first();
$html[4]=$this->prev();
$html[5]=$this->pageList();
$html[6]=$this->next();
$html[7]=$this->last();
$html[8]=$this->goPage();
$fpage='';
foreach($display as $index){
$fpage.=$html[$index];
} return $fpage; }
}