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(显示页码数)大于等于实际分页码数,则取实际页码数。
       -->否则$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

    //重构$_GETif(!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;

}

?>

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值