久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      PHP中如何不用數(shù)據(jù)庫實(shí)現(xiàn)數(shù)組分頁

      本篇文章給大家介紹一下PHP中不用數(shù)據(jù)庫實(shí)現(xiàn)數(shù)組分頁的方法。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。

      PHP中如何不用數(shù)據(jù)庫實(shí)現(xiàn)數(shù)組分頁

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

      在日常開發(fā)的業(yè)務(wù)環(huán)境中,我們一般都會(huì)使用 MySQL 語句來實(shí)現(xiàn)分頁的功能。但是,往往也有些數(shù)據(jù)并不多,或者只是獲取 PHP 中定義的一些數(shù)組數(shù)據(jù)時(shí)需要分頁的功能。這時(shí),我們其實(shí)不需要每次都去查詢數(shù)據(jù)庫,可以在一次查詢中把所有的數(shù)據(jù)取出來,然后在 PHP 的代碼層面進(jìn)行分頁功能的實(shí)現(xiàn)。今天,我們就來學(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ù)庫中取出的全部數(shù)據(jù),或者就是我們寫死在 PHP 代碼中的數(shù)據(jù)。然后我們?cè)O(shè)定 $p 為接收到的請(qǐng)求參數(shù),當(dāng)前訪問的是第二頁。$currentPage 是用于查詢偏移量的修正,在代碼開發(fā)的世界中,下標(biāo)索引都是從0開始的,所以我們需要對(duì)接收到的參數(shù)進(jìn)行減一的操作。當(dāng)然,你也可以設(shè)定前端傳遞的參數(shù)就是以 0 為第一頁的。這個(gè)就不多解釋了,相信大家只要正式的學(xué)習(xí)或者參與過開發(fā)項(xiàng)目都會(huì)明白它的意思。

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

      array_slice

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

      array_chunk

      array_chunk() 函數(shù)則是根據(jù)一個(gè)數(shù)值參數(shù)將一個(gè)數(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)容了。使用這個(gè)函數(shù)來做數(shù)組分頁的功能非常地簡(jiǎn)單直觀,而且它不需要去計(jì)算偏移量,直接就是使用當(dāng)前頁 $currentPage 和 $pageSize 就可以完成對(duì)于數(shù)據(jù)的分組了,非常推薦大家使用這個(gè)函數(shù)來進(jìn)行類似的操作。

      LimitIterator

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

      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ù)是類似的,不過不同的是,它的偏移量參數(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)

      接下來,我們看看如果參數(shù)錯(cuò)誤,也就是偏移量或者所需的數(shù)據(jù)量大小有問題的話,這些操作將會(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ù)的情況。這些我就不多寫了,大家可以根據(jù)已有的知識(shí)先猜想一下結(jié)果會(huì)是什么樣的,然后再自己寫代碼驗(yàn)證一下結(jié)果是符合自己的預(yù)期,這樣學(xué)習(xí)的效果會(huì)非常棒哦!(在下方測(cè)試代碼鏈接中有測(cè)試,結(jié)果里面是有坑的哦)

      總結(jié)

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

      測(cè)試代碼:

      https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E4%B8%AD%E7%9A%84%E6%95%B0%E7%BB%84%E5%88%86%E9%A1%B5%E5%AE%9E%E7%8E%B0%EF%BC%88%E9%9D%9E%E6%95%B0%E6%8D%AE%E5%BA%93%EF%BC%89.php

      推薦學(xué)習(xí):php視頻教程

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)