<?php
header('Content-type:text/html;charset=utf-8');
/**
分页函数
根据用户填入参数(文章总条数,每页显示条数,显示页码数等条件)智能分页。
返回limit部分及html代码部分。
分页函数构思:
function page($count,$page_size,$num_btn);
return $data=array(0->$limit,1->$html);
参数说明:$count总记录数,$page_size每页显示条数,$num_btn显示页码数。
*一、limit部分制作的核心思想:
文章1,
文章2,
文章3,
文章4,
文章5,
文章6,
文章7,
文章8,
文章9,
文章10
如果每页显示3行,则limit部分为:
limit 0,3
limit 3,3
limit 6,3
limit 9,3
算法:1/起始位置为当前页之前的所有记录,2/显示记录为$page_size
公式:($_GET['page']-1)*$page_size,$page_size
可得limit部分。
*二、html代码部分制作的核心思想:
1.)-->如果$num_btn(显示页码数)大于等于实际分页码数,则取实际页码数。
-->否则$num_btn(显示页码数)小于实际分页码数。
应首先考虑这种显示策略:
如果是奇数,当前页码在中间,左右两边各一半;
如果是偶数,右边比左边多一个页码。
算法:当前页减去左边按钮数(($num_btn-1)/2)得左边起始位置。
公式:$_GET['page'] - floor(($num_btn-1)/2);
可得当前页的起始页码数的开始位置$start(左边坐标)。
理想状态:
奇数情况下:共有100条记录,每页显示5条,共显示20页,用户要求页码数为5,
当前页为10的情况下,左右两边各为($num_btn)一半:
1,2,3,4,5,6,7,{8,9,十,11,12},13,14,15,16,17,18,19,20
偶数情况下:共有100条记录,每页显示5条,共显示20页,用户要求页码数为6,
当前页为10的情况下,右边比左边多一个页码:
1,2,3,4,5,6,7,{8,9,十,11,12,13},14,15,16,17,18,19,20
意外情况:
起始坐标($start)超出逻辑范围,左边溢出。
结束坐标($start+显示页码按钮数)超出逻辑范围,右边溢出。
2.)制作省略号及上下页效果
例:1...3,4,5,6,7,8,9...13
注意点:首位达到末尾处时,入栈有溢处情况。
约束条件:1/当$num_btn页码号不出现最小或最大时;2/$num_btn大于5时。
(注:实验过程中发现,对数组进行array_pop,array_push操作时,不会重置数组key的值。
但是经过array_shit、array_unshifu操作,会重置数组key的值)
3.)重构url、$_GET参数完成动态解析。
函数书写过程中,用page.php?page=1 进行函数测试
但是在实际开发过程中,需要对以下问题进行策略调整。
--动态url如何实现?
==$_SERVER['REQUEST_URI']
--$_GET参数可能有多个参数?
==重构url部分
4.)bug修正:
limit会出现-1,$page_size的情况。
需提前判断$count值。
*/
/**
* [page 分页函数]
* @param [int] $count [总记录行数]
* @param [int] $page_size [每页显示记录的行数]
* @param [int] $num_btn [页码数量]
* @return [array] [返回limit部分和html代码部分]
*/
function page($count,$page_size,$num_btn,$page='page'){
if($count < 1){
$data = array('limit' => '','html' => '');
return $data;
}
//判断get值合法性
if(!isset($_GET[$page]) || !is_numeric($_GET[$page]) || $_GET[$page]<1){
$_GET[$page] = 1;
}
//实际页码总数,向上取整:
$page_num_all = ceil($count/$page_size);
//get取值如果大于当前总页码数,则取最大值。
if($_GET[$page] > $page_num_all){
$_GET[$page] = $page_num_all;
}
$limitStart = ($_GET[$page]-1)*$page_size;
$limit = "limit {$limitStart},{$page_size}";
// 重构url
$reset_url = '';//用于重构url的初始化变量
$url = $_SERVER['REQUEST_URI'];// /review/php/day16_project_bbs/page.php?page=1&id=13
$url_arr = parse_url($url); // Array
$url_path = $url_arr['path'];// /review/php/day16_project_bbs/page.php
//重构$_GET值
if(!empty($url_arr['query'])){
$url_query = $url_arr['query'];// page=1&id=13
parse_str($url_query,$query_arr);//array(2) { ["page"]=> string(1) "1" ["id"]=> string(2) "13" }
unset($query_arr[$page]);
// 判断$_GET是否还有其他值的存在
if(empty($query_arr)){
$reset_url = "{$url_path}?{$page}=";
}else{
$url_args = http_build_query($query_arr);
$reset_url = "{$url_path}?{$url_args}&{$page}=";
}
}else{
$reset_url = "{$url_path}?{$page}=";
}
$html = array();//html代码的初始化变量
//情况1,如果用户传$num_btn大于等于实际页码数。
//情况2,如果用户传$num_btn小于实际页码数。
if($num_btn >= $page_num_all){
$num_btn = $page_num_all;
for($i = 1;$i <= $num_btn;$i++){
if($i == $_GET[$page]){
$html[$i] = "<span style='color:red;'>{$i}</span>";
}else{
$html[$i] = "<a href = '{$reset_url}{$i}'>{$i}</a>";
}
}
}else{
// 开始位置,向下取整。
$start = $_GET[$page] - floor(($num_btn-1)/2);
if($start < 1){
$start = 1;
}
if(($start+($num_btn-1)) > $page_num_all){
$start = $page_num_all-($num_btn-1);
}
for($i = 0;$i < $num_btn;$i++){
if($start == $_GET[$page]){
$html[$start] = "<span style='color:red;font-weight:bold;'>{$start}</span>";
}else{
$html[$start] = "<a href = '{$reset_url}{$start}'>{$start}</a>";
}
$start++;
}
if($num_btn > 5){
# 制作省略号效果-首
reset($html);//将数组指针重置第一个元素
$first_page = key($html);//取当前数组的第一个键名
end($html);//将数组的内部指针指向最后一个单元
$last_page = key($html);
// 判断数组元素首元素是否为1
if($first_page != 1){
//1.将数组开头的单元移出数组
array_shift($html);
//2.向数组开头插入一个单元
array_unshift($html,"<a href = '{$reset_url}1'>1..</a>");
}
# 制作省略号效果-首 结束
# 制作省略号效果-尾
// 判断数组元素首元素是否为$page_num_all
if($last_page != $page_num_all){
//1.将数组最后一个单元弹出
array_pop($html);
//2.将一个或多个单元压入数组的末尾
array_push($html,"<a href = '{$reset_url}{$page_num_all}'>..{$page_num_all}</a>");
}
# 制作省略号效果-尾 结束
}
# 制作 上一页 下一页效果:
$prev = $_GET[$page]-1;
$next = $_GET[$page]+1;
if($_GET[$page] != 1){
array_unshift($html,"<a href = '{$reset_url}{$prev}'>« 上一页</a>");
}
if($_GET[$page] != $page_num_all){
array_push($html,"<a href = '{$reset_url}{$next}'>下一页 »</a>");
}
}
$html = implode("\n",$html);
$data = array('limit'=>$limit,'html'=>$html);
return $data;
}
?>
PHP制作分页函数(下)
最新推荐文章于 2021-04-11 03:17:55 发布