PHP分页省略号通过手动构造混合数组实现:固定包含第1页和末页,以当前页为中心取前后各2页构成活跃窗口,若窗口左边界>2则在第1页后插入“...”,右边界同理。

PHP分页加省略号不是靠“自动识别长页码”实现的,而是手动控制页码数组的生成逻辑——关键在 range() 的边界裁剪和中间插入 ... 占位符。
怎么生成带省略号的页码数组
核心是构造一个混合类型数组:数字页码 + 字符串 ...。不能直接用 range(1, $totalPages),得拆成三段:1、中间活跃段、$totalPages,再按需插入省略号。
- 始终包含第 1 页和最后一页
- 当前页
$currentPage前后各保留 2 个页码(可调),构成“活跃窗口” - 若活跃窗口左边界 > 2,就在第 1 页后加
...;右边界 ... - 避免重复:比如
[1, ..., 5, 6, 7, ..., 100],不能出现[1, ..., ..., 100]
PHP 实现示例(不依赖框架)
以下函数返回可用于遍历渲染的页码项数组,每项是整数或字符串 ...:
function getPaginatedPageNumbers($currentPage, $totalPages, $surround = 2) {
if ($totalPages <= 1) return [1];
$pages = [];
// 总是加首页
$pages[] = 1;
// 左省略号:首页之后、活跃区之前有空隙
$leftEdge = max(2, $currentPage - $surround);
if ($leftEdge > 2) $pages[] = '...';
// 活跃页码段(含当前页)
$start = max(2, $currentPage - $surround);
$end = min($totalPages - 1, $currentPage + $surround);
for ($i = $start; $i <= $end; $i++) {
$pages[] = $i;
}
// 右省略号:活跃区之后、尾页之前有空隙
$rightEdge = min($totalPages - 1, $currentPage + $surround);
if ($rightEdge < $totalPages - 1) $pages[] = '...';
// 总是加尾页(除非已是首页)
if ($totalPages > 1) $pages[] = $totalPages;
return $pages;}
立即学习“PHP免费学习笔记(深入)”;
调用如 getPaginatedPageNumbers(7, 100) 返回 [1, '...', 5, 6, 7, 8, 9, '...', 100]。
渲染时怎么安全处理 ...
- 用
is_string($page)判断是否为省略号,跳过链接生成 - 对数字页码,确保
$page !== $currentPage才输出链接;当前页用包裹 - 不要给
...加href或onclick,它只是视觉占位符 - 注意 XSS:如果页码来自用户输入(如
$_GET['page']),务必用(int)强转后再参与逻辑,...是硬编码,无风险
为什么不用 CSS `text-overflow: ellipsis` 实现省略
那是文本截断,不是分页逻辑省略。分页省略号代表「中间页码被跳过」,需服务端明确告知前端哪些页存在、哪些被折叠——CSS 无法让 `` 标签凭空消失又留出 `...`,且 SEO 和可访问性要求页码结构语义清晰。
真要偷懒用 CSS,结果就是页码挤成一排后突然截断成 `1 2 3 4 5…`,用户点不到第 50 页,也看不出中间缺了多少页。











