本篇文章跟大家介紹一下PHP中不用資料庫實作陣列分頁的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
在日常開發的業務環境中,我們一般都會使用MySQL 語句來實現分頁的功能。但是,往往也有些資料不多,或只是取得 PHP 中定義的一些陣列資料時需要分頁的功能。這時,我們其實不需要每次都去查詢資料庫,可以在一次查詢中把所有的資料取出來,然後在 PHP 的程式碼層級進行分頁功能的實作。今天,我們就來學習一些可以實現這個能力的函數技巧。
首先,我們還是準備好測試資料。
$data = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', ]; // $p = $_GET['p']; $p = 2; $currentPage = $p <= 1 ? 0 : $p - 1; $pageSize = 3; $offset = $currentPage * $pageSize;
假設 \$data 就是從資料庫中取出的全部數據,或者就是我們寫死在 PHP 程式碼中的資料。然後我們設定 $p 為接收的請求參數,目前造訪的是第二頁。 $currentPage 是用來查詢偏移量的修正,在程式碼開發的世界中,下標索引都是從0開始的,所以我們需要對接收到的參數進行減一的操作。當然,你也可以設定前端傳遞的參數就是以 0 為第一頁的。這就不多解釋了,相信大家只要正式的學習或是參與過開發計畫都會明白它的意思。
然後我們定義了目前頁面所顯示的資訊條數 $pageSize ,也就是只取得 3 個資料。最後,我們計算了一下偏移量,也就是類似 MySQL 的 LIMIT 中的那個參數。它的作用就是告訴我們從第幾條開始查詢,然後配合 $pageSize 查詢幾條。這樣我們就可以獲得目前頁面對應的資料了。 (似乎把分頁的原理都講了一下)
第一個也是最基礎、最常見的分頁方式,就是使用array_slice() 函數來實現。它的作用是從陣列中截取出一段內容來並傳回這段內容的陣列。
var_dump(array_slice($data, $offset, $pageSize)); // array(3) { // [0]=> // string(1) "D" // [1]=> // string(1) "E" // [2]=> // string(1) "F" // }
array_slice() 函數需要三個參數,第二個參數就是偏移量,第三個參數是查詢幾個資料。其中,第三個參數是可選的,不填的話就會把目前設定的偏移量之後的資料全部顯示出來。是不是跟我們的 MySQL 查詢語句一模一樣。沒錯,他們本身就是類似的操作。
array_chunk() 函數則是根據一個數值參數將一個陣列分組,也就是將陣列分割成一段一段的子陣列。我們就可以根據分割後的陣列來取得指定下標的子數組內容,這些內容就是目前的頁面需要展示的資料了。
$pages = array_chunk($data, $pageSize); var_dump($pages); // array(4) { // [0]=> // array(3) { // [0]=> // string(1) "A" // [1]=> // string(1) "B" // [2]=> // string(1) "C" // } // [1]=> // array(3) { // [0]=> // string(1) "D" // [1]=> // string(1) "E" // [2]=> // string(1) "F" // } // [2]=> // array(3) { // [0]=> // string(1) "G" // [1]=> // string(1) "H" // [2]=> // string(1) "I" // } // [3]=> // array(2) { // [0]=> // string(1) "J" // [1]=> // string(1) "K" // } // } var_dump($pages[$currentPage]); // array(3) { // [0]=> // string(1) "A" // [1]=> // string(1) "B" // [2]=> // string(1) "C" // }
這段程式碼我們輸出了分割後的陣列內容,然後需要的是第二頁也就是下標為1 的數據,直接透過分割後的陣列就可以方便地取得到所需要的內容了。使用這個函數來做數組分頁的功能非常地簡單直觀,而且它不需要去計算偏移量,直接就是使用當前頁$currentPage 和$pageSize 就可以完成對於數據的分組了,非常推薦大家使用這個函數來進行類似的操作。
最後我們要學習到的是使用一個迭代器類別來實現數組分頁的能力,這個使用的就比較少了,估計都沒什麼好人知道,但其實LimitIterator 類別在PHP5.1 時就已經提供了。它的作用是允許遍歷一個 Iterator 的限定子集的元素。也就是說,如果我們的程式碼中使用了迭代器模式,實作了迭代器接口,那麼這些迭代器類別都可以使用這個類別進行分頁操作。
foreach (new LimitIterator(new ArrayIterator($data), $offset, $pageSize) as $d) { var_dump($d); } // string(1) "D" // string(1) "E" // string(1) "F"
它需要的實例化構造參數包含3個,第一個是一個迭代器對象,由於數組不是迭代器對象,所以我們使用ArrayIterator 實例將我們的數組資料轉換為一個迭代器對象。後面兩個參數就是偏移量和資料數量了,這個和 array_slice() 函數是類似的,不過不同的是,它的偏移量參數也是可以選的。如果我們不給後面的可選參數的話,那麼它將遍歷所有的資料。
foreach (new LimitIterator(new ArrayIterator($data)) as $d) { var_dump($d); } // string(1) "A" // string(1) "B" // string(1) "C" // string(1) "D" // string(1) "E" // string(1) "F" // string(1) "G" // string(1) "H" // string(1) "I" // string(1) "J" // string(1) "K"
接下來,我們看看如果參數錯誤,也就是偏移量或所需的資料量大小有問題的話,這些操作將會有什麼樣的表現。
var_dump(array_slice($data, $offset, 150)); // array(8) { // [0]=> // string(1) "D" // [1]=> // string(1) "E" // [2]=> // string(1) "F" // [3]=> // string(1) "G" // [4]=> // string(1) "H" // [5]=> // string(1) "I" // [6]=> // string(1) "J" // [7]=> // string(1) "K" // } var_dump(array_slice($data, 15, $pageSize)); // array(0) { // }
array_slice() 函數對於偏移錯誤的相容就是展示一個空的陣列。而資料量超標的話則會顯示所有偏移量之後的資料。
var_dump($pages[15]); // NULL
array_chunk() 對於下標不存在的資料當然就是回傳一個 NULL 值啦。
foreach (new LimitIterator(new ArrayIterator($data), $offset, 150) as $d) { var_dump($d); } // string(1) "D" // string(1) "E" // string(1) "F" // string(1) "G" // string(1) "H" // string(1) "I" // string(1) "J" // string(1) "K" foreach (new LimitIterator(new ArrayIterator($data), 15, $pageSize) as $d) { var_dump($d); } // Fatal error: Uncaught OutOfBoundsException: Seek position 15 is out of range
LimitIterator 则是对于偏移量错误的数据直接返回错误异常信息了。这也是类模式处理的好处,有错误都会以异常的形式进行返回,方便我们对异常进行后续的处理。
其它的测试大家还可以自行检测,比如偏移是 0 或者是负数的情况,数据量是 0 或者是负数的情况。这些我就不多写了,大家可以根据已有的知识先猜想一下结果会是什么样的,然后再自己写代码验证一下结果是符合自己的预期,这样学习的效果会非常棒哦!(在下方测试代码链接中有测试,结果里面是有坑的哦)
一个功能使用了三种方式来实现,这就是代码的魅力。至于哪个好哪个坏我们不多做评价,一切都是以业务为核心来进行选取。类似的功能虽说并不常见,但很多项目里都会遇到,比如说后台用户组管理就会非常常见,一般来说后台用户分组如果不是特别大型的 ERP 项目都不会很多,但有时候也会达到需要分页的程度,这时候,我们就可以考虑考虑使用今天所学的知识来做咯!
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E4%B8%AD%E7%9A%84%E6%95%B0%E7%BB%84%E5%88%86%E9%A1%B5%E5%AE%9E%E7%8E%B0%EF%BC%88%E9%9D%9E%E6%95%B0%E6%8D%AE%E5%BA%93%EF%BC%89.php
推荐学习:php视频教程
以上是PHP中如何不用資料庫實現數組分頁的詳細內容。更多資訊請關注PHP中文網其他相關文章!