PHP 8.3 原生实现数组分页,通过 array_slice 截取数据并校验页码、每页数等边界,返回含 data 和分页元信息的数组;支持类型声明、联合类型注解及 match 优化,兼顾健壮性与可读性。

PHP 8.3 中实现数组分页,无需框架、不依赖外部库,纯原生 PHP 即可完成。核心在于:计算总条数、当前页码、每页数量,再用 array_slice() 截取对应片段即可。关键不是写得多,而是边界清晰、容错到位。
基础分页逻辑(含页码校验)
用户传入的页码可能非法(如负数、字符串、超出范围),必须主动归一化:
- 页码默认为 1,小于 1 则强制设为 1
- 页码大于最大页数时,自动修正为最后一页
- 每页数量必须 ≥ 1,否则设为默认值(如 10)
- 原始数组为空时,直接返回空数组 + 分页元信息
封装成可复用函数(带完整元数据)
返回不仅包含当前页数据,还应提供分页上下文,方便前端渲染页码栏:
function array_paginate(array $data, int $page = 1, int $per_page = 10): array
{
$total = count($data);
$per_page = max(1, $per_page);
$page = max(1, (int)$page);
$last_page = $total ? (int)ceil($total / $per_page) : 1;
$page = min($page, $last_page);
<pre class="brush:php;toolbar:false;">$offset = ($page - 1) * $per_page;
$items = array_slice($data, $offset, $per_page);
return [
'data' => $items,
'current_page' => $page,
'last_page' => $last_page,
'per_page' => $per_page,
'total' => $total,
'from' => $offset + 1,
'to' => min($offset + $per_page, $total),
'has_more_pages' => $page $page > 1,
];}
PHP 8.3 特性加持(类型安全 & 简洁表达)
利用 PHP 8.3 的联合类型、只读类、短闭包等特性,可进一步增强健壮性与可读性:
- 参数类型声明使用
array和int,配合严格模式杜绝隐式转换错误 - 返回数组可配合
array{data: array, current_page: int, ...}形式注解(PHPStan/IDE 友好) - 用
match替代简单条件分支(如判断是否第一页)更语义化 - 避免手动计算
$offset错误:PHP 8.3 的array_slice对超界$length已完全兼容,不会警告
实际调用示例(含异常兜底)
真实场景中建议加一层轻量包装,捕获非数组输入等低级错误:
$users = ['u1', 'u2', 'u3', ..., 'u97'];
try {
$result = array_paginate($users, $_GET['page'] ?? 1, $_GET['limit'] ?? 15);
echo json_encode($result, JSON_UNESCAPED_UNICODE);
} catch (TypeError $e) {
http_response_code(400);
echo json_encode(['error' => 'Invalid input']);
}php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











