<?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(显示页码数)大于等于实际分页码数,则取实际页码数。
2.)否则$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+显示页码按钮数)超出逻辑范围,右边溢出。
*/
/**
* [page 分页函数]
* @param [int] $count [总记录行数]
* @param [int] $page_size [每页显示记录的行数]
* @param [int] $num_btn [页码数量]
* @return [array] [返回limit部分和html代码部分]
*/
function page($count,$page_size,$num_btn){
//判断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}";
echo $limit."<br />";
echo "当前页:".$_GET['page']."<br />";
echo "共有{$count}行记录,每页显示{$page_size}行,共显示{$page_num_all}页,";
echo "用户要求显示页码数量为:{$num_btn}<br />";
$html = '';//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 .= "<span style='color:red;'>{$i}</span> ";
}else{
$html .= "<a href = 'page.php?page={$i}'>{$i}</a> ";
}
}
echo $html;
}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 .= "<span style='color:red;font-weight:bold;'>{$start}</span> ";
}else{
$html .= "<a href = 'page.php?page={$start}'>{$start}</a> ";
}
$start++;
}
echo $html;
}
$data = array('limit'=>$limit,'html'=>$html);
return $data;
}
page(100,5,6);
echo "<hr></hr>";
page(100,5,7);
?>
输出结果:
limit 0,5
当前页:1
共有100行记录,每页显示5行,共显示20页,用户要求显示页码数量为:6
1 2 3 4 5 6limit 0,5
当前页:1
共有100行记录,每页显示5行,共显示20页,用户要求显示页码数量为:7
1 2 3 4 5 6 7
limit 80,5
当前页:17
共有100行记录,每页显示5行,共显示20页,用户要求显示页码数量为:6
15 16 17 18 19 20limit 80,5
当前页:17
共有100行记录,每页显示5行,共显示20页,用户要求显示页码数量为:7
14 15 16 17 18 19 20