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");

支持多种样式:

posted @ 2013-08-02 15:17  jerry-Tom  阅读(9599)  评论(3编辑  收藏  举报