9.1 分页类

<?php
//1 帮助我们完成select语句中的limit部分
//2 应该帮助我们完成页码列表的html部分


/*
 * 参数说明:
 * $num  数据的总行数
 * $size 每页显示的条数
 * $num_btn 页面默认显示的按钮数量
 * $page 浏览器传递的当前页
 *
 */
function page($num,$size,$num_btn=10,$page='page'){

    //1 验证$page的值
    if (!isset($_GET[$page]) || !is_numeric($_GET[$page]) || $_GET[$page]<1) {
        $_GET[$page] = 1;
    }

    //2 计算出总页数
    $page_num_all = ceil($num/$size);

    //3 验证$page的值大于总页数
    if ($_GET[$page]>$page_num_all) {
        $_GET[$page] = $page_num_all;//等于总页数
    }

    //4 求出limit的偏移量  公式:(页数-1)乘以条数
    $start = ($_GET[$page]-1)*$size;

    //5 完成limit
    $limit = "limit {$start},$size";

    echo '当前页'.$_GET[$page].'<br/>';

    //-----制作HTML按钮----------
    //根据传入函数参数num_btn来显示按钮数目

    //一 如果num_btn值大于等于总页码数
    $html = [];
    if ($num_btn >= $page_num_all) {
        for ($i=1;$i<=$page_num_all;$i++){
            if ($_GET[$page] == $i){
                $html[$i] .= "<span>{$i}</span>";
            } else {
                $html[$i] .= "<a href='demo.php?page={$i}'>{$i}</a> ";
            }
        }//num_btn大于总页码数 我们显示所有的页码数
    }

    //二 如果num_btn值小于等于总页码数
        //显示策略:当前页的左右两边的数量应该相等,或者右边比左边多一个
    if ($num_btn<$page_num_all){

        //1 求出左边的按钮数
        $left_btn =floor(($num_btn-1)/2);//(总数 - 当前页)除以2 用到偶数再用floor函数(向下取整)

        //2 求出最左边的起始页码号
        $start = $_GET[$page]-$left_btn;//当前页-左边的按钮数 = 最左边的起始页码值

        //3 如果左边 起始页码值小于1 我们就让它等于1
        if ($start<1) {
            $start=1;
        }

        //4 最后一个按钮号已经大于总页码数 我们然最后一个按钮等于最大值
        $end = $start + ($num_btn-1);
        if ($end > $page_num_all) {
            $start = $page_num_all -($num_btn-1);// 起始页码值 + (总页码数-1) = 最后页码值
        }

        for ($i=0;$i<$num_btn;$i++) {//i限制循环次数用的
            if ($_GET[$page] == $start) {
                $html[$start] .= "<span>{$start}</span>";
            } else {
                $html[$start] .= "<a href='demo.php?page={$start}'>{$start}</a> ";
            }
            $start++;//显示的页码
        }

        //如果按钮数目大于等于3的时候做  省略号效果
        if (count($html)>=3) {
            reset($html);//将数组的内部指针指向第一个单元
            $key_first = key($html); //返回数组中当前单元的键名
            //echo '第一个下标'.$key_first.'<br/>';
            end($html);//将数组的内部指针指向最后一个单元
            $key_end = key($html);
            //echo '最后一个下标:'.$key_end.'<br/>';
            if ($key_first !=1) {
                array_shift($html);//删除第一个
                array_unshift($html,"<a href='demo.php?page=1'>1....</a>");//增加一个
            }
            if ($key_end != $page_num_all) {
                array_pop($html);//弹出数组最后一个单元 (出栈)
                array_push($html,"<a href='demo.php?page={$page_num_all}'>{$page_num_all}....</a>");
            }

        }




    }

    //添加上一页
    if ($_GET[$page] != 1) {
        $prev = ($_GET[$page] -1);
        array_unshift($html,"<a href='demo.php?page={$prev}'>上一页</a>");
    }
    //添加下一页
    if ($_GET[$page] != $page_num_all) {
        $next = ($_GET[$page]+1);
        array_push($html,"<a href='demo.php?page={$next}'>下一页</a>");
    }

    $html = implode('',$html);//将一个一维数组的值转化为字符串
    //定义返回的数组
    $data['limit'] = $limit;
    $data['html']  = $html;
    return $data;
}

$page = page(100,5,10);
echo $page['html'];

 

电放费

posted @ 2020-12-25 07:31  棉花糖88  阅读(71)  评论(0)    收藏  举报