根據目前頁碼、總資料筆數、顯示頁碼數量與每頁筆數,計算出需顯示的頁碼範圍陣列,支援首頁、尾頁、中間頁碼的智慧型截取邏輯。
class PageModel {
/**
* 取得分頁陣列
* @param int $page 目前頁碼
* @param int $goodsCount 總資料筆數
* @param int $pageCountLength 顯示頁碼數量
* @param int $pageLength 每頁筆數
* @return array 頁碼陣列
*/
public static function getPageArr($page, $goodsCount, $pageCountLength, $pageLength) {
// 總頁數
$allPageCount = ceil($goodsCount / $pageLength);
// 總頁數小於等於顯示長度,直接輸出所有頁碼
if ($allPageCount <= $pageCountLength) {
$arr = [];
for ($i = 0; $i < $allPageCount; $i++) {
$arr[] = ['page' => $i + 1];
}
return $arr;
}
$halfLength = floor($pageCountLength / 2);
// 目前頁碼在前半段,顯示前 N 頁
if ($page <= $halfLength) {
$arr = [];
for ($i = 0; $i < $pageCountLength; $i++) {
$arr[] = ['page' => $i + 1];
}
return $arr;
}
// 目前頁碼在尾段,顯示後 N 頁
if ($page > $allPageCount - floor($pageCountLength / 2)) {
$arr = [];
for ($i = -$pageCountLength; $i < 0; $i++) {
$arr[] = ['page' => $allPageCount + $i + 1];
}
return $arr;
}
// 中間段:以目前頁碼為中心兩側擴展
$arr = [];
for ($i = -$halfLength; $i < $pageCountLength - $halfLength; $i++) {
$arr[] = ['page' => $page + $i];
}
return $arr;
}
}
ceil(總筆數 / 每頁筆數)[['page'=>1], ['page'=>2], ...] 方便前端模板迴圈渲染// 總共 105 筆資料,每頁 10 筆,顯示 7 個頁碼,目前在第 3 頁 $pages = PageModel::getPageArr(3, 105, 7, 10); // 輸出:頁碼 1~7 // 目前在第 10 頁(總 11 頁) $pages = PageModel::getPageArr(10, 105, 7, 10); // 輸出:頁碼 5~11
prev/next/first/last 旗標?page=3&sort=desc)此分頁類邏輯清晰、無外部依賴,適合輕量級專案或教學參考,生產環境建議搭配成熟框架內建分頁元件使用。