首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

ThinkPHP 實現陣列分頁:以 array_slice 替代 limit

     編輯:PHP 相關知識

問題背景

ThinkPHP 內建分頁類 \Think\Page 設計搭配 Model 的 limit() 方法,適用於直接查詢資料庫。但若資料已從 DB 取出並轉為陣列(如經過 API 整合、多表關聯後處理),無法直接使用 limit()。

解決思路

PHP 內建 array_slice() 即是陣列版的 LIMIT,配合 Page 類提供的 firstRow(起始索引)與 listRows(每頁筆數)即可實現陣列分頁。

完整 Controller 範例

<?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()同

適用場景

  • 外部 API 回傳完整資料集,需本地分頁
  • 多表關聯後合併為單一陣列
  • 資料經過複雜業務邏輯處理,無法直接用 SQL 分頁

此法簡潔高效,充分利用框架既有分頁元件,避免重造輪子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved