在日常開發的業務環境中,我們一般都會使用 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)
array_slice() 函式需要三個引數,第二個引數就是偏移量,第三個引數是查詢幾條資料。其中,第三個引數是可選的,不填的話就會把當前設定的偏移量之後的資料全部顯示出來。是不是和我們的 mysql 查詢語句一模一樣。沒錯,他們本身就是類似的操作。
array_chunk() 函式則是根據乙個數值引數將乙個陣列進行分組,也就是將陣列分割成一段一段的子陣列。我們就可以根據分割後的陣列來獲取指定下標的子陣列內容,這些內容就是當前的頁面需要展示的資料了。
$pages = array_chunk($data, $pagesize);
var_dump($pages);
// array(4)
// [1]=>
// array(3)
// [2]=>
// array(3)
// [3]=>
// array(2)
// }
var_dump($pages[$currentpage]);
// array(3)
這段**我們輸出了分割後的陣列內容,然後需要的是第二頁也就是下標為 1 的資料,直接通過分割後的陣列就可以方便地獲取到所需要的內容了。使用這個函式來做陣列分頁的功能非常地簡單直觀,而且它不需要去計算偏移量,直接就是使用當前頁 $currentpage 和 $pagesize 就可以完成對於資料的分組了,非常推薦大家使用這個函式來進行類似的操作。
最後我們要學習到的是使用乙個迭代器類來實現陣列分頁的能力,這個使用的就比較少了,估計都沒什麼人知道,但其實 limititerator 類在 php5.1 時就已經提供了。它的作用是允許遍歷乙個 iterator 的限定子集的元素。也就是說,如果我們的**中使用了迭代器模式,實現了迭代器介面,那麼這些迭代器類都可以使用這個類進行分頁操作。
foreach (new limititerator(new arrayiterator($data), $offset, $pagesize) as $d)
// string(1) "d"
// string(1) "e"
// string(1) "f"
它需要的例項化構造引數包含3個,第乙個是乙個迭代器物件,由於陣列不是迭代器物件,所以我們使用 arrayiterator 例項將我們的陣列資料轉化為乙個迭代器物件。後面兩個引數就是偏移量和資料數量了,這個和 array_slice() 函式是類似的,不過不同的是,它的偏移量引數也是可以選的。如果我們不給後面的可選引數的話,那麼它將遍歷所有的資料。
foreach (new limititerator(new arrayiterator($data)) as $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)
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)
// 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)
// fatal error: uncaught outofbound***ception: seek position 15 is out of range
limititerator 則是對於偏移量錯誤的資料直接返回錯誤異常資訊了。這也是類模式處理的好處,有錯誤都會以異常的形式進行返回,方便我們對異常進行後續的處理。
其它的測試大家還可以自行檢測,比如偏移是 0 或者是負數的情況,資料量是 0 或者是負數的情況。這些我就不多寫了,大家可以根據已有的知識先猜想一下結果會是什麼樣的,然後再自己寫**驗證一下結果是符合自己的預期,這樣學習的效果會非常棒哦!(在下方測試**鏈結中有測試,結果裡面是有坑的哦)
乙個功能使用了三種方式來實現,這就是**的魅力。至於哪個好哪個壞我們不多做評價,一切都是以業務為核心來進行選取。類似的功能雖說並不常見,但很多專案裡都會遇到,比如說後台使用者組管理就會非常常見,一般來說後台使用者分組如果不是特別大型的 erp 專案都不會很多,但有時候也會達到需要分頁的程度,這時候,我們就可以考慮考慮使用今天所學的知識來做咯!
測試**:
php 陣列內容分頁 php陣列分頁實現方法
arr click array array clicks 3,clickdate 2010 10 11 array clicks 2,clickdate 2010 10 10 array clicks 3,clickdate 2010 10 09 array clicks 4,clickdate 2...
PHP實現資料庫資料的分頁
一 實現思路 1.使用bootstrap框架,實現資料庫的連線,以及sql指令的執行 2.寫html中的table 用bootstrap中的 樣式進行修飾 3.在分頁的鏈結上新增引數 4.獲得當前的頁號 5.控制翻頁 向上不得超過第一頁,向下不得超過最後一頁 6.獲得總頁數 7.求得總頁數 8.求得...
資料庫實現分頁
寫乙個資料庫通用的分頁功能,對於乙個專案來說這個是很實用的功能,可以自己封裝成jar包來使用 首先來新建乙個工程,目錄如下 然後新建乙個 pager類,如下 package com.page.ben public class pager public pager int pagesize,int r...