欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP 實現(xiàn)數(shù)組分頁

 更新時間:2021年06月16日 10:48:54   作者:硬核項目經(jīng)理  
在日常開發(fā)的業(yè)務(wù)環(huán)境中,我們一般都會使用MySQL語句來實現(xiàn)分頁的功能。但是,往往也有些數(shù)據(jù)并不多,或者只是獲取 PHP 中定義的一些數(shù)組數(shù)據(jù)時需要分頁的功能。這時,我們可以在一次查詢中把所有的數(shù)據(jù)取出來,然后在 PHP 的代碼層面進(jìn)行分頁功能的實現(xiàn)

今天,我們就來學(xué)習(xí)一下可以實現(xiàn)這個能力的一些函數(shù)技巧。

首先,我們還是準(zhǔn)備好測試數(shù)據(jù)。

$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;

假設(shè) \$data 就是從數(shù)據(jù)庫中取出的全部數(shù)據(jù),或者就是我們寫死在 PHP 代碼中的數(shù)據(jù)。然后我們設(shè)定 $p 為接收到的請求參數(shù),當(dāng)前訪問的是第二頁。$currentPage 是用于查詢偏移量的修正,在代碼開發(fā)的世界中,下標(biāo)索引都是從0開始的,所以我們需要對接收到的參數(shù)進(jìn)行減一的操作。當(dāng)然,你也可以設(shè)定前端傳遞的參數(shù)就是以 0 為第一頁的。這個就不多解釋了,相信大家只要正式的學(xué)習(xí)或者參與過開發(fā)項目都會明白它的意思。

然后我們定義了當(dāng)前頁面所顯示的信息條數(shù) $pageSize ,也就是只獲取 3 條數(shù)據(jù)。最后,我們計算了一下偏移量,也就是類似于 MySQL 的 LIMIT 中的那個參數(shù)。它的作用就是告訴我們從第幾條開始查詢,然后配合 $pageSize 查詢幾條。這樣我們就可以獲得當(dāng)前頁面對應(yīng)的數(shù)據(jù)了。(貌似把分頁的原理都講了一下)

array_slice

第一個也是最基礎(chǔ)和最常見的分頁方式,就是使用 array_slice() 函數(shù)來實現(xiàn)。它的作用是從數(shù)組中截取出一段內(nèi)容來并返回這段內(nèi)容的數(shù)組。

var_dump(array_slice($data, $offset, $pageSize));
// array(3) {
//     [0]=>
//     string(1) "D"
//     [1]=>
//     string(1) "E"
//     [2]=>
//     string(1) "F"
//   }

array_slice() 函數(shù)需要三個參數(shù),第二個參數(shù)就是偏移量,第三個參數(shù)是查詢幾條數(shù)據(jù)。其中,第三個參數(shù)是可選的,不填的話就會把當(dāng)前設(shè)定的偏移量之后的數(shù)據(jù)全部顯示出來。是不是和我們的 MySQL 查詢語句一模一樣。沒錯,他們本身就是類似的操作。

array_chunk

array_chunk() 函數(shù)則是根據(jù)一個數(shù)值參數(shù)將一個數(shù)組進(jìn)行分組,也就是將數(shù)組分割成一段一段的子數(shù)組。我們就可以根據(jù)分割后的數(shù)組來獲取指定下標(biāo)的子數(shù)組內(nèi)容,這些內(nèi)容就是當(dāng)前的頁面需要展示的數(shù)據(jù)了。

$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"
//   }

這段代碼我們輸出了分割后的數(shù)組內(nèi)容,然后需要的是第二頁也就是下標(biāo)為 1 的數(shù)據(jù),直接通過分割后的數(shù)組就可以方便地獲取到所需要的內(nèi)容了。使用這個函數(shù)來做數(shù)組分頁的功能非常地簡單直觀,而且它不需要去計算偏移量,直接就是使用當(dāng)前頁 $currentPage 和 $pageSize 就可以完成對于數(shù)據(jù)的分組了,非常推薦大家使用這個函數(shù)來進(jìn)行類似的操作。

LimitIterator

最后我們要學(xué)習(xí)到的是使用一個迭代器類來實現(xiàn)數(shù)組分頁的能力,這個使用的就比較少了,估計都沒什么人知道,但其實 LimitIterator 類在 PHP5.1 時就已經(jīng)提供了。它的作用是允許遍歷一個 Iterator 的限定子集的元素。也就是說,如果我們的代碼中使用了迭代器模式,實現(xiàn)了迭代器接口,那么這些迭代器類都可以使用這個類進(jìn)行分頁操作。

foreach (new LimitIterator(new ArrayIterator($data), $offset, $pageSize) as $d) {
    var_dump($d);
}
// string(1) "D"
// string(1) "E"
// string(1) "F"

它需要的實例化構(gòu)造參數(shù)包含3個,第一個是一個迭代器對象,由于數(shù)組不是迭代器對象,所以我們使用 ArrayIterator 實例將我們的數(shù)組數(shù)據(jù)轉(zhuǎn)化為一個迭代器對象。后面兩個參數(shù)就是偏移量和數(shù)據(jù)數(shù)量了,這個和 array_slice() 函數(shù)是類似的,不過不同的是,它的偏移量參數(shù)也是可以選的。如果我們不給后面的可選參數(shù)的話,那么它將遍歷所有的數(shù)據(jù)。

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"

參數(shù)錯誤時的表現(xiàn)

接下來,我們看看如果參數(shù)錯誤,也就是偏移量或者所需的數(shù)據(jù)量大小有問題的話,這些操作將會有什么樣的表現(xiàn)。

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() 函數(shù)對于偏移量錯誤的兼容就是展示一個空的數(shù)組。而數(shù)據(jù)量超標(biāo)的話則會展示所有偏移量之后的數(shù)據(jù)。

var_dump($pages[15]);
// NULL

array_chunk() 對于下標(biāo)不存在的數(shù)據(jù)當(dāng)然就是返回一個 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 則是對于偏移量錯誤的數(shù)據(jù)直接返回錯誤異常信息了。這也是類模式處理的好處,有錯誤都會以異常的形式進(jìn)行返回,方便我們對異常進(jìn)行后續(xù)的處理。

其它的測試大家還可以自行檢測,比如偏移是 0 或者是負(fù)數(shù)的情況,數(shù)據(jù)量是 0 或者是負(fù)數(shù)的情況。這些我就不多寫了,大家可以根據(jù)已有的知識先猜想一下結(jié)果會是什么樣的,然后再自己寫代碼驗證一下結(jié)果是符合自己的預(yù)期,這樣學(xué)習(xí)的效果會非常棒哦?。ㄔ谙路綔y試代碼鏈接中有測試,結(jié)果里面是有坑的哦)

總結(jié)

一個功能使用了三種方式來實現(xiàn),這就是代碼的魅力。至于哪個好哪個壞我們不多做評價,一切都是以業(yè)務(wù)為核心來進(jìn)行選取。類似的功能雖說并不常見,但很多項目里都會遇到,比如說后臺用戶組管理就會非常常見,一般來說后臺用戶分組如果不是特別大型的 ERP 項目都不會很多,但有時候也會達(dá)到需要分頁的程度,這時候,我們就可以考慮考慮使用今天所學(xué)的知識來做咯!

測試代碼

以上就是PHP 實現(xiàn)數(shù)組分頁的詳細(xì)內(nèi)容,更多關(guān)于PHP 數(shù)組分頁的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • thinkPHP5 ajax提交表單操作實例分析

    thinkPHP5 ajax提交表單操作實例分析

    這篇文章主要介紹了thinkPHP5 ajax提交表單操作,結(jié)合實例形式分析了thinkPHP5的ajax提交表單操作技巧,并附帶說明了表單提交中的參數(shù)傳遞與處理技巧,需要的朋友可以參考下
    2017-11-11
  • ThinkPHP CURD方法之order方法詳解

    ThinkPHP CURD方法之order方法詳解

    ThinkPHP CURD方法的order用于對操作的結(jié)果排序。這篇文章主要介紹了order方法的用法,需要的朋友可以參考下
    2014-06-06
  • LotusPhp筆記之:Logger組件的使用方法

    LotusPhp筆記之:Logger組件的使用方法

    本篇文章是對Logger組件的使用方法進(jìn)行了介紹。需要的朋友參考下
    2013-05-05
  • Yii2.0框架模型多表關(guān)聯(lián)查詢示例

    Yii2.0框架模型多表關(guān)聯(lián)查詢示例

    這篇文章主要介紹了Yii2.0框架模型多表關(guān)聯(lián)查詢,結(jié)合實例形式總結(jié)分析了Yii2.0框架多表關(guān)聯(lián)查詢相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • php實現(xiàn)微信小程序訂閱消息推送(access_token獲取緩存刷新)

    php實現(xiàn)微信小程序訂閱消息推送(access_token獲取緩存刷新)

    這篇文章主要為大家介紹了php實現(xiàn)微信小程序訂閱消息推送包含access_token獲取緩存刷新示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • ThinkPhP5整合微信小程序訂閱消息實用代碼

    ThinkPhP5整合微信小程序訂閱消息實用代碼

    記錄一下開發(fā)小程序消息推送的實例,配合后端tp推送,要使用微信訂閱通知功能,需要用戶首先在小程序點擊訂閱后,后臺方可推送相關(guān)訂閱通知模板,否則無法直接推送
    2023-08-08
  • PHP連接MYSQL數(shù)據(jù)庫實例代碼

    PHP連接MYSQL數(shù)據(jù)庫實例代碼

    現(xiàn)在做的項目需要php連接mysql數(shù)據(jù)庫,雖然之前學(xué)過,但是現(xiàn)在基本上都給忘了,之后通過查找相關(guān)資料找到了解決方法,下面小編把具體方法分享在腳本之家平臺供大家學(xué)習(xí)
    2016-01-01
  • php實現(xiàn)加減法驗證碼代碼

    php實現(xiàn)加減法驗證碼代碼

    這篇文章主要介紹了php實現(xiàn)的加減法驗證碼代碼,可以使用10以內(nèi)的加減法生成圖片,需要的朋友可以參考下
    2014-02-02
  • thinkphp5引入公共部分header、footer的方法詳解

    thinkphp5引入公共部分header、footer的方法詳解

    小編做的項目需要在項目中需要用到引入公共導(dǎo)航、頭部、底部、右邊部分等等,接下來通過本文給大家介紹thinkphp5引入公共部分header、footer的方法 ,需要的朋友可以參考下
    2018-09-09
  • Yii2.0多文件上傳實例說明

    Yii2.0多文件上傳實例說明

    本文通過實例代碼給大家介紹了Yii2.0多文件上傳實例說明,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-07-07

最新評論