ThinkPHP 內建分頁類 \Think\Page 設計搭配 Model 的 limit() 方法,適用於直接查詢資料庫。但若資料已從 DB 取出並轉為陣列(如經過 API 整合、多表關聯後處理),無法直接使用 limit()。
PHP 內建 array_slice() 即是陣列版的 LIMIT,配合 Page 類提供的 firstRow(起始索引)與 listRows(每頁筆數)即可實現陣列分頁。
<?php
namespace Home\Controller;
use Think\Controller;
class NodeController extends Controller {
public function nodeslist() {
// 1. 取得資料陣列(假設已含 'data' 鍵)
$portal = new \Api\PortalApi();
$nodelist = $portal->getNodeLists($this->uid); // 返回 ['data' => [...]]
// 2. 計算總筆數
$count = count($nodelist['data']);
// 3. 實例化分頁類(每頁 10 筆)
$page = new \Think\Page($count, 10);
// 4. 陣列切片:array_slice(陣列, 起始, 長度)
$lists = array_slice($nodelist['data'], $page->firstRow, $page->listRows);
// 5. 分配變數給模板
$this->assign('nodes', $lists);
$this->assign('page', $page->show());
$this->display();
}
}
?>
<div class="page-list">
{$page}
</div>
自訂分頁樣式(在 Controller 或配置檔設定):
$page->setConfig('header', '<span class="rows">共 %TOTAL_ROW% 筆記錄</span>');
$page->setConfig('prev', '上一頁');
$page->setConfig('next', '下一頁');
$page->setConfig('first', '首頁');
$page->setConfig('last', '尾頁');
$page->setConfig('theme', '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END%');
| 步驟 | 資料庫分頁 | 陣列分頁 |
|---|---|---|
| 總筆數 | $model->count() | count($array) |
| 分頁類 | new Page($count, $perPage) | 同 |
| 取資料 | $model->limit($page->firstRow.','.$page->listRows)->select() | array_slice($array, $page->firstRow, $page->listRows) |
| 輸出分頁 | $page->show() | 同 |
此法簡潔高效,充分利用框架既有分頁元件,避免重造輪子。