PHP制作分页函数(下)

2017-01-14 08:42:30来源:CSDN作者:qq_28629495人点击

第七城市
<?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;}?>

这里写图片描述

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台