PHP中的陣列分頁實現(非資料庫)

2021-10-11 20:46:39 字數 3979 閱讀 9639

在日常開發的業務環境中,我們一般都會使用 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...