中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中不用數據庫實現數組分頁的方法

發布時間:2021-06-16 09:44:08 來源:億速云 閱讀:177 作者:chen 欄目:編程語言

這篇文章主要講解了“PHP中不用數據庫實現數組分頁的方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“PHP中不用數據庫實現數組分頁的方法”吧!

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

第一個也是最基礎和最常見的分頁方式,就是使用 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

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

最后我們要學習到的是使用一個迭代器類來實現數組分頁的能力,這個使用的就比較少了,估計都沒什么人知道,但其實 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 或者是負數的情況。這些我就不多寫了,大家可以根據已有的知識先猜想一下結果會是什么樣的,然后再自己寫代碼驗證一下結果是符合自己的預期,這樣學習的效果會非常棒哦!

感謝各位的閱讀,以上就是“PHP中不用數據庫實現數組分頁的方法”的內容了,經過本文的學習后,相信大家對PHP中不用數據庫實現數組分頁的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嵊泗县| 咸阳市| 浪卡子县| 响水县| 阳新县| 越西县| 定西市| 乌拉特中旗| 肇东市| 盐山县| 化德县| 沧州市| 大田县| 贵德县| 陈巴尔虎旗| 揭西县| 房山区| 蚌埠市| 新野县| 凭祥市| 兴文县| 云阳县| 边坝县| 梁平县| 蓝田县| 日土县| 绥宁县| 明水县| 临潭县| 万宁市| 太仓市| 探索| 田林县| 镇平县| 孝义市| 苗栗市| 都江堰市| 南漳县| 永济市| 利川市| 永寿县|