首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 分頁工具類設計核心邏輯:滑動窗口算法完整解析

     編輯:PHP 相關知識

分頁元件的核心難點在於「當前頁附近顯示固定數量頁碼,且首尾頁永遠可見」的滑動窗口邏輯。本文深度解析兩種實現思路,附完整代碼與視覺效果示意。

核心隱喻:尺子在木塊上滑動

  • 木塊:總頁數 _totalPages
  • 尺子:顯示頁碼數 _totalShowPages
  • 滑動限制:尺子兩端不得超出木塊

方案一:統一計算起始點(推薦)

protected function _getShowPageNumber() {
    $pageHtml = '';
    // 1. 計算起始頁 $start
    if ($this->_curPage - 2 > 1) {
        $start = $this->_curPage - 2; // 當前頁置中顯示(前後各2頁)
    } else {
        $start = 1; // 靠近首頁時貼齊左側
    }
    // 2. 計算結束頁 $end
    $end = $start + $this->_totalShowPages;
    if ($end >= $this->_totalPages) {
        $end = $this->_totalPages;
        $start = $end - $this->_totalShowPages; // 靠近尾頁時貼齊右側
    }
    // 3. 輸出首頁 + 省略號
    if ($start != 1) {
        $pageHtml .= $this->_getPageHtml(1);
        $preMore = max(1, $this->_curPage - $this->_totalShowPages);
        $pageHtml .= $this->_getMorePageHtml($preMore);
    }
    // 4. 輸出中間連續頁碼
    for ($page = $start; $page < $end; $page++) {
        $pageHtml .= $this->_getPageHtml($page);
    }
    // 5. 輸出尾頁 + 省略號
    if ($end != $this->_totalPages) {
        $pageHtml .= $this->_getMorePageHtml($end);
    }
    $pageHtml .= $this->_getNormalPageHtml($this->_totalPages);
    return $pageHtml;
}

方案二:分段條件判斷(直觀但冗長)

protected function _getShowPageNumberTwo() {
    if ($this->_curPage < $this->_totalShowPages) {
        // 當前頁在前段:直接輸出 1 ~ _totalShowPages
        for ($page = 1; $page < $this->_totalShowPages; $page++) { ... }
        $pageHtml .= $this->_getMorePageHtml($this->_totalShowPages);
        $pageHtml .= $this->_getNormalPageHtml($this->_totalPages);
    } else {
        // 當前頁在中後段
        $pageHtml .= $this->_getNormalPageHtml(1);
        $morePos = ($this->_curPage == $this->_totalShowPages) ? 1 : $this->_curPage - $this->_totalShowPages;
        $pageHtml .= $this->_getMorePageHtml($morePos);
        if ($this->_curPage + $this->_totalShowPages >= $this->_totalPages) {
            // 靠近尾頁
            for ($page = $this->_totalPages - $this->_totalShowPages; $page <= $this->_totalPages; $page++) { ... }
        } else {
            // 中間區域
            $start = $this->_curPage - 2;
            $end = $this->_curPage + $this->_totalShowPages - 2;
            for ($page = $start; $page < $end; $page++) { ... }
            $pageHtml .= $this->_getMorePageHtml($this->_curPage + $this->_totalShowPages - 2);
            $pageHtml .= $this->_getNormalPageHtml($this->_totalPages);
        }
    }
    return $pageHtml;
}

視覺效果示意

分頁效果圖1

分頁效果圖2

分頁效果圖3

關鍵輔助方法(需自行實現)

  • _getPageHtml($page):生成單個頁碼 <a href="?page=3">3</a>
  • _getMorePageHtml($page):生成省略號 <span class="more">...</span> 或跳轉鏈接
  • _getNormalPageHtml($page):生成首/尾頁固定鏈接

擴充建議

  • 加入 prev/next、first/last 導航按鈕
  • 支援 URL 重寫模式(/page/3)與查詢字串保留
  • AJAX 分頁時輸出 JSON 結構而非 HTML
  • 大數據量採用「游標分頁」替代 OFFSET/LIMIT
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved