PHP制作分页函数(上)

<?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 6

limit 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 20

limit 80,5
当前页:17
共有100行记录,每页显示5行,共显示20页,用户要求显示页码数量为:7
14 15 16 17 18 19 20

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值