php多维数组分页直接用array_slice()切最外层,前提是索引数组;关联键需先array_values()转索引;须校验页码防越界;大数据量应源头分页或流式处理。

直接用 array_slice() 切多维数组就行
PHP 本身不区分“一维”或“多维”数组的分页逻辑——array_slice() 只认索引,不管内部结构。只要你的多维数组是「索引数组」(即键为连续数字,如 [0 => [...], 1 => [...], ...]),就能直接切。
常见错误是误以为要递归处理每一层,其实分页只作用于最外层数组长度。比如你有 120 条用户记录,每条是关联数组:$users = [['id'=>1,'name'=>'A'], ['id'=>2,'name'=>'B'], ...],那分页就是对这 120 个元素切片。
- 第 1 页(每页 10 条):
array_slice($users, 0, 10) - 第 3 页:
array_slice($users, 20, 10)(起始偏移 = (页码−1) × 每页数量) - 注意:
array_slice()默认保留原键名;加第 4 个参数true可重置为数字索引:array_slice($users, 0, 10, true)
怎么判断当前页是否越界
分页必须防越界,否则 array_slice() 返回空数组但不报错,容易导致“第 999 页显示空白”这类静默问题。
关键不是查数组长度,而是算出最大合法页码再比对:
- 先获取总条数:
$total = count($users) - 每页数量设为
$per_page = 15 - 最大页码:
$max_page = (int) ceil($total / $per_page)(注意用ceil,避免整除时少算一页) - 当前页
$page若$page $max_page,就该跳转到第 1 页或提示 404
关联键名的多维数组不能直接分页?
如果外层数组是关联键(如 ['user_1001' => [...], 'user_1002' => [...]]),array_slice() 按数字偏移切会失效——因为没有 0、1 这些键。
这时得先转成索引数组再切:
- 用
array_values($users)提取值并重排索引(丢弃原键,不影响内层结构) - 再用
array_slice(array_values($users), $offset, $per_page) - 如果后续还要靠原键查数据,建议分页前就用
array_keys($users)单独存一份 ID 映射表,分页只操作 ID 列表,再按需查原数组
大数据量时别真切数组
当多维数组超过几千项(比如读了整个 JSON 文件或导出报表),array_slice() 虽快,但内存里已载入全部数据,分页只是“假装没加载”,实际浪费资源。
更合理的做法是:在数据源头控制(数据库查时用 LIMIT + OFFSET),或者用生成器流式处理:
- 写个
yield函数,遍历大数组时只 yield 当前页范围内的项 - 避免一次性
json_decode(file_get_contents(...))整个大文件 - 如果必须用 PHP 数组分页,至少加个
memory_get_usage()监控,超阈值就抛异常而不是硬切
真正麻烦的从来不是怎么切,而是没想清楚——这个多维数组,本该不该一次性全 load 进来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











