PHP分页函数

我们经常会从数据库里读取的数据显示出来,当数据行较多时就需要把数据分页显示。
这里写了一个通用的分页函数:paging.func.php

<?php
/**
 * 数据分页函数
 * @param integer $count     数据总行数
 * @param integer $showCount 显示行数
 * @param integer $index     当前页号
 * @param integer $navCount  导航最大项数
 * @return array(
 *    'curIndex' => 当前页号,
 *    'pageCount' => 总页数,
 *    'beginIndex' => 当前页开始行,
 *    'endIndex' => 当前页结束行,
 *    'count' => 数据行数,
 *    'nav' => array(
 *        'curIndex' => 当前页号,
 *        'beginIndex' => 分页导航开始页,
 *        'endIndex' => 分页导航结束页,
 *        'prevIndex' => 上一页,
 *        'nextIndex' => 下一页,
 *        'firstIndex' => 首页,
 *        'lastIndex' => 尾页,
 *    )
 * )
 */
function Paging($count, $showCount, $index, $navCount){
    $pageCount = (integer)($count / $showCount);
    if($count % $showCount){
        $pageCount += 1;
    }
    $beginIndex = $index * $showCount;
    $endIndex = $beginIndex + $showCount;
    if($endIndex > $count){
        $endIndex = $count;
    }
    $ret = array(
        'pageCount' => $pageCount,
        'curIndex' => $index,
        'beginIndex' => $beginIndex,
        'endIndex' => $endIndex,
        'count' => $count,
    );

    $beginIndex = $index - (integer)($navCount / 2);
    if($beginIndex < 0){
        $beginIndex = 0;
    }
    $endIndex = $beginIndex + $navCount;
    if($endIndex > $pageCount){
        $endIndex = $pageCount;
        $beginIndex = max(0, $endIndex - $navCount);
    }

    $ret['nav'] = array(
        'beginIndex' => $beginIndex,
        'endIndex' => $endIndex,
        'curIndex' => $index,
        'prevIndex' => max(0, $index - 1),
        'nextIndex' => min($pageCount, $index + 1),
        'firstIndex' => 0,
        'lastIndex' => $pageCount - 1,
    );
    return $ret;
}
?>

使用例子:test-paging.php

<?php
require 'paging.func.php';

/**
 * 随机生成字符串
 * @param string $length 字符串长度
 */
function RandomString($length){
    static $range = '0123456789qwertyuiopasdfghjklzxcvbnm';
    $rangeLen = strlen($range);
    $string = '';
    for($i = 0 ; $i < $length; ++ $i){
        $string .= $range[mt_rand(0, $rangeLen - 1)];
    }
    return $string;
}

/**
 * 查询数据
 * @param integer $count 数据表行数
 */
function QueryData($count){
    for($i = 0; $i < $count; ++ $i){
        $data[$i] = array(
            'id' => ($i + 1000),
            'name' => RandomString(mt_rand(4, 10)),
        );
    }
    return $data;
}

/**
 * 显示数据表
 * @param  array   $data      数据表
 * @param  integer $showCount 每页行数
 * @param  integer $count     总行数
 * @param  integer $index     当前页号
 * @param  integer $navCount  导航显示页数
 */
function showData($data, $showCount, $count, $index, $navCount){
    $pag = Paging($count, $showCount, $index, $navCount);
    echo "<table>";
    echo "<tr><th>id</th><th>name</td><tr>";
    for($i = $pag['beginIndex']; $i < $pag['endIndex']; ++ $i){
        $row = &$data[$i];
        echo "<tr>";
            echo "<td>{$row['id']}</td>";
            echo "<td>{$row['name']}</td>";
        echo "</tr>";
    }
    echo "</table>";

    echo "</div>";
    $nav = &$pag['nav'];
    if(0 < $pag['curIndex']){
        echo " <a href='?index={$nav['firstIndex']}'>首页</a>";
        echo " <a href='?index={$nav['prevIndex']}'>上一页</a>";
    }
    for($i = $nav['beginIndex']; $i < $nav['endIndex']; ++ $i){
        $showNum = $i + 1;
        if($i == $index){
            echo " <span>{$showNum}</span>";
        }else{
            echo " <a href='?index={$i}'><b>{$showNum}</b></a>";
        }
    }
    if($pag['curIndex'] + 1 < $pag['pageCount']){
        echo " <a href='?index={$nav['nextIndex']}'>下一页</a>";
        echo " <a href='?index={$nav['lastIndex']}'>尾页</a>";
    }
    echo " 总{$pag['pageCount']}页 {$pag['count']}条";
    echo "</div>";
}

$data = QueryData(75);
$index = isset($_REQUEST['index']) ? $_REQUEST['index'] : 0;
showData($data, 10, 75, $index, 5);
?>

测试截图:
截图1

截图2

截图3

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值