You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改PHP分页代码实现带省略号的分页效果?

如何实现带省略号的精简PHP分页?

我是一名PHP新手,已经查阅了相关问题但没找到合适的解决方案,恳请不要将此问题标记为重复或降权。

以下是我当前的分页代码:

<?php 
$per_page = 10; 
if(isset($_GET['page'])){ 
    $page = $_GET['page']; 
} else { 
    $page = 1; 
} 
if($page == "" || $page == 1) { 
    $page_1 = 0; 
} else { 
    $page_1 = ($page * $per_page) - $per_page; 
} 
$item_count = "SELECT * FROM products"; 
$find_count = mysqli_query($connection, $item_count); 
$count = mysqli_num_rows($find_count); 
$count_pages = ceil($count / $per_page) ; 
?>
<ul class="pagination">
<?php for($i = 1; $i <= $count_pages; $i++){ 
    if($i == $page) { 
        echo "<li><a class='active-page' href='./latest.php?page=$i'>$i</a></li>"; 
    } else { 
        echo "<li><a href='./latest.php?page=$i'>$i</a></li>"; 
    } 
} ?>
</ul>

当前分页会显示全部页码(例如1 2 3 4 5 6 7 8 9 10),我希望实现带省略号的精简分页:

  • 当用户在第3页时,显示“1 2 3 4 5 ... 9 10”
  • 当用户在第9页时,显示“1 2 ... 7 8 9 10”

请问如何修改代码实现该效果?


嘿,这个需求我太熟悉了!大数量的全页码显示确实很不友好,咱们来调整代码实现你要的精简效果。核心思路是根据当前页码的位置,只显示首尾关键页码、当前页附近的页码,用省略号代替中间跳过的部分。

修改后的完整代码

<?php 
$per_page = 10; 
// 安全处理页码:确保是正整数,避免非法输入导致错误
$page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1;
// 简化起始偏移量计算,和你原来的逻辑完全等价
$page_1 = ($page - 1) * $per_page;

$item_count = "SELECT * FROM products"; 
$find_count = mysqli_query($connection, $item_count); 
$count = mysqli_num_rows($find_count); 
$count_pages = ceil($count / $per_page) ; 

// 定义当前页前后需要显示的页码数量,这里设为2,可按需调整
$adjacent_pages = 2;
?>
<ul class="pagination">
<?php
// 1. 固定显示第一页
echo "<li><a href='./latest.php?page=1'" . ($page == 1 ? " class='active-page'" : "") . ">1</a></li>";

// 2. 处理前半部分的省略号和第二页
if ($page > $adjacent_pages + 1) {
    // 当前页离第一页足够远,显示第二页和省略号
    echo "<li><a href='./latest.php?page=2'>2</a></li>";
    echo "<li><span>...</span></li>";
} elseif ($page == $adjacent_pages + 1) {
    // 当前页是第3页,直接显示第二页
    echo "<li><a href='./latest.php?page=2'>2</a></li>";
}

// 3. 显示当前页周围的页码
$start_page = max($adjacent_pages + 1, $page - $adjacent_pages);
$end_page = min($count_pages - $adjacent_pages, $page + $adjacent_pages);
for ($i = $start_page; $i <= $end_page; $i++) {
    echo "<li><a href='./latest.php?page=$i'" . ($i == $page ? " class='active-page'" : "") . ">$i</a></li>";
}

// 4. 处理后半部分的省略号和倒数第二页
if ($page < $count_pages - $adjacent_pages) {
    // 当前页离最后一页足够远,显示省略号和倒数第二页
    echo "<li><span>...</span></li>";
    echo "<li><a href='./latest.php?page=" . ($count_pages - 1) . "'>" . ($count_pages - 1) . "</a></li>";
} elseif ($page == $count_pages - $adjacent_pages) {
    // 当前页是倒数第三页,直接显示倒数第二页
    echo "<li><a href='./latest.php?page=" . ($count_pages - 1) . "'>" . ($count_pages - 1) . "</a></li>";
}

// 5. 固定显示最后一页(总页数大于1时才显示,避免单页重复)
if ($count_pages > 1) {
    echo "<li><a href='./latest.php?page=$count_pages'" . ($page == $count_pages ? " class='active-page'" : "") . ">$count_pages</a></li>";
}
?>
</ul>

效果验证(以总页数10为例)

  • 当前页为3:会显示 1 2 3 4 5 ... 9 10,完全符合你的需求
  • 当前页为9:会显示 1 2 ... 7 8 9 10,正好达到你要的效果

额外优化说明

  1. 我给页码加了安全处理,用max(1, intval($_GET['page']))确保页码不会是负数或非整数,避免非法输入导致的SQL错误或逻辑异常
  2. 简化了起始偏移量的计算,($page - 1) * $per_page和你原来的代码逻辑完全一致,但可读性更强
  3. 用$adjacent_pages变量控制显示的相邻页码数量,后续你想调整显示范围(比如前后各1页),只需要修改这个变量的值即可

内容的提问来源于stack exchange,提问作者Ash Archin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:39:24