當資料已完整載入記憶體(如 API 回傳、快取資料)時,可在 PHP 端對陣列進行分頁。本文比較自訂分頁函式與 array_slice() 兩種做法,並討論效能考量。
<?php
function page($array, $pagesize, $current) {
$total = ceil(count($array) / $pagesize); // 總頁數
$prev = ($current - 1) <= 0 ? 1 : ($current - 1); // 上一頁
$next = ($current + 1) >= $total ? $total : $current + 1; // 下一頁
$current = $current > $total ? $total : $current; // 修正當前頁
$start = ($current - 1) * $pagesize; // 起始索引
$data = array();
for ($i = $start; $i < $start + $pagesize && $i < count($array); $i++) {
$data[] = $array[$i];
}
return array(
'source' => $data,
'page' => "<a href='?page=1'>首頁</a> " .
"<a href='?page=$prev'>上一頁</a> " .
"<a href='?page=$next'>下一頁</a> " .
"<a href='?page=$total'>尾頁</a>"
);
}
// 使用範例
$array = range(1, 20);
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$result = page($array, 5, $page);
foreach ($result['source'] as $item) {
echo $item . ' ';
}
echo $result['page'];
?>
array_slice()(推薦)<?php
$array = range(1, 20);
$pagesize = 5;
$page = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1;
$offset = ($page - 1) * $pagesize;
$pageData = array_slice($array, $offset, $pagesize, true); // true 保留鍵名
// 顯示資料
foreach ($pageData as $item) echo $item . ' ';
// 簡易分頁連結
$total = ceil(count($array) / $pagesize);
for ($i = 1; $i <= $total; $i++) {
echo "<a href='?page=$i'>$i</a> ";
}
?>
注意:若資料來源為資料庫,務必在 SQL 層面用
LIMIT/OFFSET分頁,避免將大量資料載入記憶體再切片。PHP 端分頁僅適合資料量較小(如 < 10,000 筆)且已須完整載入的場景。
若資料量中等(數百筆),可一次輸出完整資料到前端,再用 JavaScript(如 DataTables、Vue、React)做分頁渲染,減少伺服器往返,提升使用者體驗。
array_values($arr) 重新建立數字索引,或用 array_splice($arr, $index, 1) 刪除並自動重排索引。$newArr = array_values($arr); 或 sort($arr);(會重新排序)。