zoukankan      html  css  js  c++  java
  • php 分页类

    <?php
    /*
     *本程序文件对分页程序进行了封装
     *
    */
    
    class Page_Link
    {
        var $page_max = 10; //一组页码的最大数
    
        var $page_num = 10; //总页数
        var $length = 20; //一页的数据条数
    
        var $isNextPage = true;
        var $isFirstPage = false;
    
        function Calculation_Page_Num( $total )
        {
            $this->page_num = ceil( $total / $this->length );
            return $this->page_num;
        }
    
        function Calculation_Min_Max( $act_page = 1 )
        {
            // 定义左右偏移量
            $py_left = 0;
            $py_right = 0;
            // 定义左右边界
            $bj_left = 0;
            $bj_right = 0;
            // 定义滚动区间边界
            $gd_left = 0;
            $gd_right = 0;
            // 判断是否需要分组
            if ( ( $this->page_num - $this->page_max ) <= 0 )
            {
                // 不需要分组
                $bj_left = 1;
                $bj_right = $this->page_num;
            }
            else
            {
                // 要进行分组
                // 判断容量的奇偶
                $tmp = $this->page_max % 2;
                if ( $tmp === 1 )
                {
                    // 奇数
                    $py_left = $py_right = ( $this->page_max - 1 ) / 2;
                }
                else
                {
                    // 偶数
                    $py_left = $this->page_max / 2 - 1;
                    $py_right = $this->page_max / 2;
                }
                // 计算滚动区间
                $gd_left = 1 + $py_left;
                $gd_right = $this->page_num - $py_right;
                // 判断当前页是否落入了滚动区间
                if ( $act_page >= $gd_left && $act_page <= $gd_right )
                {
                    // 区间内
                    $bj_left = $act_page - $py_left;
                    $bj_right = $act_page + $py_right;
                }
                else
                {
                    // 区间外
                    if ( ( $act_page - $py_left ) <= 1 )
                    {
                        // 左侧固定区间
                        $bj_left = 1;
                        $bj_right = $this->page_max;
                    }
                    else
                    {
                        $bj_left = $this->page_num - $this->page_max + 1;
                        $bj_right = $this->page_num;
                    }
                }
            }
    
            $res = array();
            $res['min'] = $bj_left;
            $res['max'] = $bj_right;
    
            return $res;
           
        }
        // 主方法
        function make_page( $total, $act_page, $url, $param )
        {
            $page_num = $this->Calculation_Page_Num( $total );
            $arr_min_max = $this->Calculation_Min_Max( $act_page );
            
            if (!eregi("([?|&]$param=)", $url)) {
                $url = strpos($url,"?")===false?$url."?":$url."&";
                $url = $url."$param=0";
            }
    
            if ( $act_page > $page_num )
            {
                $act_page = $page_num;
            }
            // 用正则把url改成正规的
            $url = eregi_replace( $param . '=[0-9]+', $param . '=0', $url );
    
            $res = array();
            $d = 0;
            for( $i = $arr_min_max['min'];$i <= $arr_min_max['max'];$i++ )
            {
                if ( $i == $act_page )
                {
                    $res[$d]['url'] = '';
                    $res[$d]['name'] = $i;
                    $res[$d]['no'] = $i;
                }
                else
                {
                    $res[$d]['url'] = str_replace( $param . '=0', $param . '=' . $i, $url );
                    $res[$d]['name'] = $i;
                    $res[$d]['no'] = $i;
                }
                $d++;
            }
    
            if ( $this->isNextPage )
            {
                $res = $this->make_before_next_link( $res, $act_page, $url, $param );
            }
            if ( $this->isFirstPage )
            {
                $res = $this->make_first_end_link( $res, $act_page, $url, $param );
            }
            return $res;
        }
        //// 带总页数
        function make_page_with_total( $total, $act_page, $url, $param )
        {
            $page_num = $this->Calculation_Page_Num( $total );
            $arr_min_max = $this->Calculation_Min_Max( $act_page );
            
            if (!eregi("([?|&]$param=)", $url)) {
                $url = strpos($url,"?")===false?$url."?":$url."&";
                $url = $url."$param=0";
            }
    
            if ( $act_page > $page_num )
            {
                $act_page = $page_num;
            }
            // 用正则把url改成正规的
            $url = eregi_replace( $param . '=[0-9]+', $param . '=0', $url );
    
            $res = array();
            $d = 0;
            for( $i = $arr_min_max['min'];$i <= $arr_min_max['max'];$i++ )
            {
                if ( $i == $act_page )
                {
                    $res[$d]['url'] = '';
                    $res[$d]['name'] = $i;
                    $res[$d]['no'] = $i;
                }
                else
                {
                    $res[$d]['url'] = str_replace( $param . '=0', $param . '=' . $i, $url );
                    $res[$d]['name'] = $i;
                    $res[$d]['no'] = $i;
                }
                $d++;
            }
    
            if ( $this->isNextPage )
            {
                $res = $this->make_before_next_link( $res, $act_page, $url, $param );
            }
            if ( $this->isFirstPage )
            {
                $res = $this->make_first_end_link( $res, $act_page, $url, $param );
            }
            
            $total_num= ceil($total/$this->length);
            $result['total']=$total_num;
            $result['DATA']=$res;
            return $result;
        }
        
        // 附加上一页和下一页
        function make_before_next_link( $arr, $act, $url, $param )
        {
            $tmp = array();
    
            $before = $act - 1;
            $next = $act + 1;
    
            if ( $before < 1 )
            {
                $before = 1;
                $tmp[0]['url'] = '';
                $tmp[0]['name'] = "上一页";
                $tmp[0]['no'] = $before;
            }
            else
            {
                $tmp[0]['url'] = str_replace( $param . '=0', $param . '=' . $before, $url );
                $tmp[0]['name'] = "上一页";
                $tmp[0]['no'] = $before;
            }
    
            $counts = sizeof( $arr );
            $tmp_count = sizeof( $tmp );
            for( $i = 0;$i < $counts;$i++ )
            {
                $tmp[$tmp_count]['url'] = $arr[$i]['url'];
                $tmp[$tmp_count]['name'] = $arr[$i]['name'];
                $tmp[$tmp_count]['no'] = $arr[$i]['no'];
                $tmp_count++;
            }
    
            if ( $next > $this->page_num )
            {
                $next = $this->page_num;
                $tmp[$tmp_count]['url'] = '';
                $tmp[$tmp_count]['name'] = "下一页";
                $tmp[$tmp_count]['no'] = $next;
            }
            else
            {
                $tmp[$tmp_count]['url'] = str_replace( $param . '=0', $param . '=' . $next, $url );
                $tmp[$tmp_count]['name'] = "下一页";
                $tmp[$tmp_count]['no'] = $next;
            }
    
            return $tmp;
        }
        
        // 附加首页和尾页
        function make_first_end_link( $arr, $act, $url, $param )
        {
            $tmp = array();
    
            $before = 1;
            $next = $this->page_num;
    
            if ( $act == 1 )
            {
                $before = 1;
                $tmp[0]['url'] = '';
                $tmp[0]['name'] = "首页";
                $tmp[0]['no'] = $before;
            }
            else
            {
                $tmp[0]['url'] = str_replace( $param . '=0', $param . '=' . $before, $url );
                $tmp[0]['name'] = "首页";
                $tmp[0]['no'] = $before;
            }
    
            $counts = sizeof( $arr );
            $tmp_count = sizeof( $tmp );
            for( $i = 0;$i < $counts;$i++ )
            {
                $tmp[$tmp_count]['url'] = $arr[$i]['url'];
                $tmp[$tmp_count]['name'] = $arr[$i]['name'];
                $tmp[$tmp_count]['no'] = $arr[$i]['no'];
                $tmp_count++;
            }
    
            if ( $act == $this->page_num )
            {
                $tmp[$tmp_count]['url'] = '';
                $tmp[$tmp_count]['name'] = "尾页";
                $tmp[$tmp_count]['no'] = $next;
            }
            else
            {
                $tmp[$tmp_count]['url'] = str_replace( $param . '=0', $param . '=' . $next, $url );
                $tmp[$tmp_count]['name'] = "尾页";
                $tmp[$tmp_count]['no'] = $next;
            }
    
            return $tmp;
        }
        
         
        /**
         * 带上一页<,下一页>,省略号的分页
         * @param int $total        记录总条数
         * @param int $act_page        当前页码
         * @param string $url        url
         * @param int $maxpageicon    最大显示页码数
         * @param int $style        上一页,下一页显示样式
         * @param string $param        url参数
         */
        function make_page_with_points( $total,$act_page,$url,$maxpageicon,$style,$param )
        {
            $page_num = $this->Calculation_Page_Num( $total );        //总页数
            $arr_min_max = $this->Calculation_Min_Max( $act_page );        //最大页,最小页    
            if($total==0)
            {
                 return "";
    
            }
            if( $act_page > $page_num )
            {
                $act_page = $page_num+1;
                $page_num = $page_num+1;
            }
            
            switch ($style){
                case 1:
                    $name_before = '前一页';
                    $name_next = '后一页';
                    break;
                case 2:
                    $name_before = '<';
                    $name_next = '>';
                    break;
                case 3:
                    $name_before = '<<';
                    $name_next = '>>';
                    break;
                default:
                    $name_before = '上一页';
                    $name_next = '下一页';
            }
            
            if (!eregi("([?|&]$param=)", $url)) {
                $url = strpos($url,"?")===false?$url."?":$url."&";
                $url = $url."$param=0";
            }
                    
            // 用正则把url改成正规的
            $url = eregi_replace( $param . '=[0-9]+', $param . '=0', $url );
            $res = array();
            $no_before = $act_page-1;
            $no_next = $act_page+1;
            
            //总页数如果小于等于初始化最大呈现页数
            if ($page_num<= ($maxpageicon + 1))
            {
                //如果当前页数是首页  上一页无效
                if ($act_page == 1)    
                {
                    $res[0]['url'] = '';
                    $res[0]['name'] = $name_before;
                    $res[0]['no'] = $no_before;
                }
                else            //上一页有效
                {
                    $res[0]['url'] = str_replace( $param . '=0', $param . '=' .($act_page - 1), $url );
                    $res[0]['name'] = $name_before;
                    $res[0]['no'] = $no_before;  
                }
                //循环添加页码
                $d = 1;
                for ($i = 1; $i <= $page_num; $i++)
                {
                    if ($i != $act_page)
                    {
                        $res[$d]['url'] = str_replace( $param . '=0', $param . '=' . $i, $url );
                        $res[$d]['name'] = $i;
                        $res[$d]['no'] = $i;
                    }
                    else    //当前页,页码
                    {
                        $res[$d]['url'] = '';
                        $res[$d]['name'] = $i;
                        $res[$d]['no'] = $i;
                        $res[$d]['attr'] = 'current';
                    }
                    $d++;
                }
                $last_d = count($res);
                //判断尾页
                if($act_page == $page_num)    //下一页无效
                {
                    $res[$last_d]['url'] = '';
                    $res[$last_d]['name'] = $name_next;
                    $res[$last_d]['no'] = $no_next;        
                }
                else
                {
                      $res[$last_d]['url'] = str_replace( $param . '=0', $param . '=' .($act_page + 1), $url );
                    $res[$last_d]['name'] = $name_next;
                    $res[$last_d]['no'] = $no_next;
                }
            }else if ($page_num > ($maxpageicon + 1))//如果总页数满足添加省略号
            { 
                if ($act_page <= $maxpageicon) //如果当前页小于等于初始化数目
                {
                    //如果当前页数是首页  上一页无效
                    if ($act_page == 1)    
                    {
                        $res[0]['url'] = '';
                        $res[0]['name'] = $name_before;
                        $res[0]['no'] = $no_before;
                    }
                    else            //上一页有效
                    {
                        $res[0]['url'] = str_replace( $param . '=0', $param . '=' .($act_page - 1), $url );
                        $res[0]['name'] = $name_before;
                        $res[0]['no'] = $no_before;  
                    }
                    //循环添加页码
                    $d = 1;
                    for ($i = 1; $i <= $maxpageicon; $i++)
                    {
                        if ($i != $act_page)
                        {
                            $res[$d]['url'] = str_replace( $param . '=0', $param . '=' . $i, $url );
                            $res[$d]['name'] = $i;
                            $res[$d]['no'] = $i;
                        }
                        else    //当前页,页码
                        {
                            $res[$d]['url'] = '';
                            $res[$d]['name'] = $i;
                            $res[$d]['no'] = $i;
                            $res[$d]['attr'] = 'current';
                        }
                        $d++;
                    }
                    $last_d = count($res);
                    //添加省略号
                    $res[$last_d]['url'] = '';
                    $res[$last_d]['name'] = '...';
                    $res[$last_d]['no'] = '';
                    //总页数
                    $res[$last_d+1]['url'] = str_replace( $param . '=0', $param . '=' . $page_num, $url );
                    $res[$last_d+1]['name'] = $page_num;
                    $res[$last_d+1]['no'] = $page_num;
                    //下一页
                    $res[$last_d+1]['url'] = str_replace( $param . '=0', $param . '=' . ($act_page + 1), $url );
                    $res[$last_d+1]['name'] = $name_next;
                    $res[$last_d+1]['no'] = $no_next;         
                }else//如果当前页大于最大显示页面
                {
                    if ($act_page > ($page_num - $maxpageicon))//满足后几页
                    {
                        //上一页
                        $res[0]['url'] = str_replace( $param . '=0', $param . '=' .($act_page - 1), $url );
                        $res[0]['name'] = $name_before;
                        $res[0]['no'] = $no_before;
                        //第一页
                        $res[1]['url'] = str_replace( $param . '=0', $param . '=1', $url );
                        $res[1]['name'] = 1;
                        $res[1]['no'] = 1;   
                        //省略号
                        $res[2]['url'] = '';
                        $res[2]['name'] = '...';
                        $res[2]['no'] = '';  
                        $d = 3;
                        for ($i = ($page_num - $maxpageicon + 1); $i <= $page_num; $i++)
                        {
                            if ($i != $act_page)
                            {
                                $res[$d]['url'] = str_replace( $param . '=0', $param . '=' . $i, $url );
                                $res[$d]['name'] = $i;
                                $res[$d]['no'] = $i;
                            }
                            else    //当前页,页码
                            {
                                $res[$d]['url'] = '';
                                $res[$d]['name'] = $i;
                                $res[$d]['no'] = $i;
                                $res[$d]['attr'] = 'current';
                            }
                            $d++;
                        }
                        $last_d = count($res);
                        //判断尾页
                        if($act_page == $page_num)    //下一页无效
                        {
                              $res[$last_d]['url'] = '';
                            $res[$last_d]['name'] = $name_next;
                            $res[$last_d]['no'] = $no_next;        
                        }
                        else
                        {
                              $res[$last_d]['url'] = str_replace( $param . '=0', $param . '=' .($act_page + 1), $url );
                            $res[$last_d]['name'] = $name_next;
                            $res[$last_d]['no'] = $no_next;
                        }
    
                    }else//满足处在中间
                    {
                        //上一页
                        $res[0]['url'] = str_replace( $param . '=0', $param . '=' .($act_page - 1), $url );
                        $res[0]['name'] = $name_before;
                        $res[0]['no'] = $no_before;
                        //第一页
                        $res[1]['url'] = str_replace( $param . '=0', $param . '=1', $url );
                        $res[1]['name'] = 1;
                        $res[1]['no'] = 1;   
                        //省略号
                        $res[2]['url'] = '';
                        $res[2]['name'] = '...';
                        $res[2]['no'] = '';  
                        for ($i = ($act_page - ($maxpageicon - 2) / 2); $i <= floor($act_page+($maxpageicon - 2) / 2); $i++)
                        {
                            $i = ceil($i);
                            if ($i != $act_page)
                            {
                                $res[$d]['url'] = str_replace( $param . '=0', $param . '=' . $i, $url );
                                $res[$d]['name'] = $i;
                                $res[$d]['no'] = $i;
                            }
                            else    //当前页,页码
                            {
                                $res[$d]['url'] = '';
                                $res[$d]['name'] = $i;
                                $res[$d]['no'] = $i;
                                $res[$d]['attr'] = 'current';
                            }
                            $d++;
                       }
                        $last_d = count($res);
                        //加省略号
                        $res[$last_d]['url'] = '';
                        $res[$last_d]['name'] = '...';
                        $res[$last_d]['no'] = '';
                        //当前页
                        $res[$last_d+1]['url'] = str_replace( $param . '=0', $param . '=' . $page_num, $url );
                        $res[$last_d+1]['name'] = $page_num;
                        $res[$last_d+1]['no'] = $page_num;        
                        //下一页
                        $res[$last_d+2]['url'] = str_replace( $param . '=0', $param . '=' . ($act_page + 1), $url );
                        $res[$last_d+2]['name'] = $name_next;
                        $res[$last_d+2]['no'] = $no_next;
                        //exit;    
                     }
                }
            }
            return $res;
        }
    }
    
    ?>

    使用方法 :

    $page_no = $_GET['page_no'] ? $_GET['page_no'] : 1;
    $count = 20;
    $start = ($page_no-1)*$count;
    $end = $start + $count;
    $page = new Page_Link();
    $page->length = $count;
    $page->isFirstPage = true;
    $url = $_SERVER['SCRIPT_NAME']."?&a=".$a;
    $page_arr = $page->make_page($total_num,$page_no,$url,"page_no");

    支持多种样式:

  • 相关阅读:
    leetcode 850. Rectangle Area II
    leetcode 699. Falling Squares 线段树的实现
    leetcode 847. Shortest Path Visiting All Nodes 无向连通图遍历最短路径
    leetcode 843. Guess the Word
    javaMail实现收发邮件(三)
    javaMail实现收发邮件(二)
    javaMail实现收发邮件(一)
    springboot整合websocket实现一对一消息推送和广播消息推送
    jieba分词/jieba-analysis(java版)
    java实现两个不同list对象合并后并排序
  • 原文地址:https://www.cnblogs.com/mbailing/p/3232646.html
Copyright © 2011-2022 走看看