PHP中不用數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)組分頁(yè)的方法

這篇文章主要講解了“PHP中不用數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)組分頁(yè)的方法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“PHP中不用數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)組分頁(yè)的方法”吧!

創(chuàng)新互聯(lián)長(zhǎng)期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為西充企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),西充網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

PHP中的數(shù)組分頁(yè)實(shí)現(xiàn)(非數(shù)據(jù)庫(kù))

在日常開(kāi)發(fā)的業(yè)務(wù)環(huán)境中,我們一般都會(huì)使用 MySQL 語(yǔ)句來(lái)實(shí)現(xiàn)分頁(yè)的功能。但是,往往也有些數(shù)據(jù)并不多,或者只是獲取 PHP 中定義的一些數(shù)組數(shù)據(jù)時(shí)需要分頁(yè)的功能。這時(shí),我們其實(shí)不需要每次都去查詢數(shù)據(jù)庫(kù),可以在一次查詢中把所有的數(shù)據(jù)取出來(lái),然后在 PHP 的代碼層面進(jìn)行分頁(yè)功能的實(shí)現(xiàn)。今天,我們就來(lái)學(xué)習(xí)一下可以實(shí)現(xiàn)這個(gè)能力的一些函數(shù)技巧。

首先,我們還是準(zhǔn)備好測(cè)試數(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ù)庫(kù)中取出的全部數(shù)據(jù),或者就是我們寫(xiě)死在 PHP 代碼中的數(shù)據(jù)。然后我們?cè)O(shè)定 $p 為接收到的請(qǐng)求參數(shù),當(dāng)前訪問(wèn)的是第二頁(yè)。$currentPage 是用于查詢偏移量的修正,在代碼開(kāi)發(fā)的世界中,下標(biāo)索引都是從0開(kāi)始的,所以我們需要對(duì)接收到的參數(shù)進(jìn)行減一的操作。當(dāng)然,你也可以設(shè)定前端傳遞的參數(shù)就是以 0 為第一頁(yè)的。這個(gè)就不多解釋了,相信大家只要正式的學(xué)習(xí)或者參與過(guò)開(kāi)發(fā)項(xiàng)目都會(huì)明白它的意思。

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

array_slice

第一個(gè)也是最基礎(chǔ)和最常見(jiàn)的分頁(yè)方式,就是使用 array_slice() 函數(shù)來(lái)實(shí)現(xiàn)。它的作用是從數(shù)組中截取出一段內(nèi)容來(lá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ù)需要三個(gè)參數(shù),第二個(gè)參數(shù)就是偏移量,第三個(gè)參數(shù)是查詢幾條數(shù)據(jù)。其中,第三個(gè)參數(shù)是可選的,不填的話就會(huì)把當(dāng)前設(shè)定的偏移量之后的數(shù)據(jù)全部顯示出來(lái)。是不是和我們的 MySQL 查詢語(yǔ)句一模一樣。沒(méi)錯(cuò),他們本身就是類似的操作。

array_chunk

array_chunk() 函數(shù)則是根據(jù)一個(gè)數(shù)值參數(shù)將一個(gè)數(shù)組進(jìn)行分組,也就是將數(shù)組分割成一段一段的子數(shù)組。我們就可以根據(jù)分割后的數(shù)組來(lái)獲取指定下標(biāo)的子數(shù)組內(nèi)容,這些內(nèi)容就是當(dāng)前的頁(yè)面需要展示的數(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)容,然后需要的是第二頁(yè)也就是下標(biāo)為 1 的數(shù)據(jù),直接通過(guò)分割后的數(shù)組就可以方便地獲取到所需要的內(nèi)容了。使用這個(gè)函數(shù)來(lái)做數(shù)組分頁(yè)的功能非常地簡(jiǎn)單直觀,而且它不需要去計(jì)算偏移量,直接就是使用當(dāng)前頁(yè) $currentPage 和 $pageSize 就可以完成對(duì)于數(shù)據(jù)的分組了,非常推薦大家使用這個(gè)函數(shù)來(lái)進(jìn)行類似的操作。

LimitIterator

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

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

它需要的實(shí)例化構(gòu)造參數(shù)包含3個(gè),第一個(gè)是一個(gè)迭代器對(duì)象,由于數(shù)組不是迭代器對(duì)象,所以我們使用 ArrayIterator 實(shí)例將我們的數(shù)組數(shù)據(jù)轉(zhuǎn)化為一個(gè)迭代器對(duì)象。后面兩個(gè)參數(shù)就是偏移量和數(shù)據(jù)數(shù)量了,這個(gè)和 array_slice() 函數(shù)是類似的,不過(guò)不同的是,它的偏移量參數(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ù)錯(cuò)誤時(shí)的表現(xiàn)

接下來(lái),我們看看如果參數(shù)錯(cuò)誤,也就是偏移量或者所需的數(shù)據(jù)量大小有問(wèn)題的話,這些操作將會(huì)有什么樣的表現(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ù)對(duì)于偏移量錯(cuò)誤的兼容就是展示一個(gè)空的數(shù)組。而數(shù)據(jù)量超標(biāo)的話則會(huì)展示所有偏移量之后的數(shù)據(jù)。

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

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

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

感謝各位的閱讀,以上就是“PHP中不用數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)組分頁(yè)的方法”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)PHP中不用數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)組分頁(yè)的方法這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站標(biāo)題:PHP中不用數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)組分頁(yè)的方法
網(wǎng)頁(yè)鏈接:http://muchs.cn/article16/jpiegg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)公司、企業(yè)建站定制開(kāi)發(fā)建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化