在 PHP 開發中,分頁是處理大量資料時的基本功。雖然現代框架都內建分頁元件,但理解原生陣列分頁的核心邏輯,有助於在特殊情況下快速實作或除錯。本文將詳細解析如何使用 PHP 陣列函數實作分頁功能。
以下是一個完整的分頁函數,接受三個參數:資料陣列、每頁筆數、目前頁碼:
<?php
function paginate(array $items, int $perPage, int $currentPage = 1): array {
// 計算總頁數
$totalPages = (int) ceil(count($items) / $perPage);
// 修正頁碼範圍
$currentPage = max(1, min($currentPage, $totalPages));
// 計算資料切片範圍
$offset = ($currentPage - 1) * $perPage;
$pagedItems = array_slice($items, $offset, $perPage);
// 產生導航連結
$prevPage = $currentPage > 1 ? $currentPage - 1 : 1;
$nextPage = $currentPage < $totalPages ? $currentPage + 1 : $totalPages;
$navigation = 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' => $pagedItems,
'pagination' => [
'current_page' => $currentPage,
'per_page' => $perPage,
'total_pages' => $totalPages,
'total_items' => count($items),
'navigation' => $navigation
]
];
}
以下示範如何使用上述函數處理 20 筆測試資料:
<?php
// 模擬資料來源
$data = range(1, 20);
// 從 URL 取得頁碼,預設為第 1 頁
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
// 呼叫分頁函數
$result = paginate($data, 5, $page);
// 輸出當頁資料
echo "<h3>第 {$result['pagination']['current_page']} 頁資料</h3>";
echo "<ul>";
foreach ($result['data'] as $item) {
echo "<li>項目 {$item}</li>";
}
echo "</ul>";
// 輸出分頁導航
echo $result['pagination']['navigation'];
LIMIT 和 OFFSET,避免一次撈取所有資料再切片rel="prev/next" 標籤meta 和 links 物件掌握陣列分頁核心邏輯後,您可以根據專案需求靈活調整,或作為理解框架內建分頁機制的基礎。