如何修改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,正好达到你要的效果
额外优化说明
- 我给页码加了安全处理,用
max(1, intval($_GET['page']))确保页码不会是负数或非整数,避免非法输入导致的SQL错误或逻辑异常 - 简化了起始偏移量的计算,
($page - 1) * $per_page和你原来的代码逻辑完全一致,但可读性更强 - 用
$adjacent_pages变量控制显示的相邻页码数量,后续你想调整显示范围(比如前后各1页),只需要修改这个变量的值即可
内容的提问来源于stack exchange,提问作者Ash Archin
相关产品推荐
相关产品推荐

