php数组分页需用array_slice($arr, ($page-1)*$per_page, $per_page)切片,页码从1起、偏移量防负值;须校验$page≥1、$per_page≤100,手动计算total/last_page/from/to等元信息,封装为返回data+meta的函数,仅适用于小数据量场景。

直接用 array_slice() 配合分页参数切数组
PHP 数组本身没有“内置分页”,所谓分页结构,就是把一个大数组按 $page 和 $per_page 拆成当前页数据 + 总页数信息。核心就靠 array_slice() 定位起始位置:array_slice($arr, ($page - 1) * $per_page, $per_page)。注意页码从 1 开始,所以要减 1;起始偏移量不能为负,$page 小于 1 时得兜底。
常见错误是直接用 $page * $per_page 当偏移量,结果第 1 页就跳过前 $per_page 个元素。还有人忘记检查 $page 是否超出范围,导致 array_slice() 返回空数组却不报错,前端显示空白页。
-
$page必须是整数且 ≥ 1,建议用(int)max(1, $_GET['page'] ?? 1)强制转换并兜底 -
$per_page建议限制上限(比如 ≤ 100),防恶意传大值拖慢array_slice() - 空数组或
$page过大时,array_slice()返回空数组,需单独判断是否“无数据”而非“出错”
手动计算总页数和分页元信息
只切数据不够,前端通常还需要 total、last_page、from、to 这类字段。这些都得自己算:总条数用 count($arr),总页数是 ceil(count($arr) / $per_page),当前页起始序号是 ($page - 1) * $per_page + 1,结束序号是 min($page * $per_page, count($arr))。
别用 sizeof() 替代 count()——两者行为一致但 count() 是标准写法;也别在循环里反复调用 count(),数组长度不变,算一次存变量即可。
- 如果数组非常大(比如上万项),
count()仍是 O(1),放心用 -
ceil()的结果可能为 0(当$arr为空且$per_page > 0),此时last_page应设为 1 或 0,按业务定 -
from/to要考虑边界:空数组时from = 0,to = 0更合理
封装成可复用的分页函数
重复写切片+计算逻辑容易出错,建议封装。函数签名类似:function paginate_array(array $arr, int $page, int $per_page): array,返回包含 data、total、per_page、current_page、last_page、from、to 的关联数组。
关键点在于:不修改原数组(array_slice 本身不改)、参数校验前置、空数组快速返回。别在里面做 HTML 渲染或请求参数解析——那是控制器或视图的事。
- 不要在函数里读
$_GET,由调用方传入干净的$page和$per_page - 返回数组结构尽量贴近 Laravel 的
Paginator或前端常用格式(如{ data: [], meta: { ... } }),方便后续替换为数据库分页 - 如果后续要迁移到数据库分页,这个函数的返回结构就是 mock 的好起点
什么时候不该用数组分页
数组分页只适合数据量小、已全部加载到内存的场景,比如配置项列表、静态菜单、缓存后的搜索结果。一旦原始数组来自数据库查询且未加限制(比如 SELECT * FROM huge_table),先 fetchAll() 再分页等于把全表拉进 PHP 内存,OOM 风险极高。
真实项目中,95% 的“数组分页”需求其实该用数据库 LIMIT/OFFSET 或游标分页。用数组分页只是开发期快速验证逻辑,上线前必须替换。
- 数组超过 5000 项就该警惕:内存占用、
array_slice()虽快但仍是拷贝操作 - 若数组来自
json_decode()大文件,先确认是否真需要全量加载——有时流式解析或分块读取更合适 - 多维数组分页要注意:确保
$arr是一维索引数组,关联数组分页后键名会重置为数字,原 key 丢失
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











