分頁是 Web 應用程式中常見的需求。雖然現代框架都內建分頁元件,但理解如何用原生 PHP 陣列函式實作分頁邏輯,有助於掌握核心運算原理,也能在輕量專案中快速部署。本文提供一個完整、可直接執行的分頁類別範例。
/**
* 陣列分頁函式
* @param array $data 待分頁資料陣列
* @param int $pageSize 每頁筆數
* @param int $current 目前頁碼(從 1 開始)
* @return array 包含分頁資料與導航 HTML
*/
function paginateArray(array $data, int $pageSize, int $current = 1): array
{
$totalItems = count($data);
$totalPages = (int) ceil($totalItems / $pageSize);
// 修正頁碼範圍
$current = max(1, min($current, $totalPages));
// 計算資料切片範圍
$offset = ($current - 1) * $pageSize;
$pagedData = array_slice($data, $offset, $pageSize);
// 產生上一頁、下一頁頁碼
$prevPage = max(1, $current - 1);
$nextPage = min($totalPages, $current + 1);
// 組裝導航連結
$navLinks = sprintf(
'<a href="?page=1">首頁</a> <a href="?page=%d">上一頁</a> <a href="?page=%d">下一頁</a> <a href="?page=%d">末頁</a>',
$prevPage, $nextPage, $totalPages
);
return [
'data' => $pagedData,
'current' => $current,
'total' => $totalPages,
'nav_html' => $navLinks,
];
}
// 模擬資料來源
$items = range(1, 20); // 1~20 共 20 筆
// 取得目前頁碼(預設第 1 頁)
$page = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1;
// 呼叫分頁函式
$result = paginateArray($items, 5, $page);
// 輸出當頁資料
echo "第 {$result['current']} 頁 / 共 {$result['total']} 頁
";
foreach ($result['data'] as $item) {
echo "項目:$item
";
}
// 輸出分頁導航
echo $result['nav_html'];
| 步驟 | 說明 |
|---|---|
| 總頁數計算 | ceil(count($data) / $pageSize) 向上取整 |
| 頁碼修正 | 確保 $current 在 1~總頁數區間內 |
| 資料切片 | 使用 array_slice() 依 offset 與 length 擷取 |
| 導航產生 | 動態計算首頁、上一頁、下一頁、末頁連結 |
$pageSize。/page/3)。LIMIT/OFFSET 或游標分頁,避免一次載入全部陣列。此範例展示了分頁的核心數學與陣列操作,理解後可靈活套用於各種資料來源。