ホームページ  >  記事  >  バックエンド開発  >  PHP での配列ページング実装の詳細な説明 (非データベース)

PHP での配列ページング実装の詳細な説明 (非データベース)

藏色散人
藏色散人転載
2021-06-23 09:35:482086ブラウズ

日常の開発ビジネス環境では、通常、MySQL ステートメントを使用してページング機能を実装します。ただし、多くの場合、データが大きくない場合や、ページング関数は PHP で定義された配列データを取得するためだけに必要な場合があります。

現時点では、実際には毎回データベースにクエリを実行する必要はなく、1 回のクエリですべてのデータをフェッチし、PHP コード レベルでページング関数を実装できます。

今日は、この機能を実現できるいくつかの関数テクニックを学びます。

まず、引き続きテスト データを準備します。

$data = [
    'A',
    'B',
    'C',
    'D',
    'E',
    'F',
    'G',
    'H',
    'I',
    'J',
    'K',
];

// $p = $_GET['p'];
$p = 2;
$currentPage = $p aaea7baac866f8149eb21a167de11b75
//     string(1) "D"
//     [1]=>
//     string(1) "E"
//     [2]=>
//     string(1) "F"
//   }

array_slice() 関数には 3 つのパラメータが必要です。2 番目のパラメータはオフセットで、3 番目のパラメータは複数のデータをクエリするためのものです。このうち、3 番目のパラメータはオプションであり、未入力の場合は現在設定されているオフセット以降のデータがすべて表示されます。これは 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"
//   }

このコードでは、分割された配列の内容を出力します。次に必要なのは 2 ページ目、つまり添え字 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 インスタンスを使用して配列データをイテレータ オブジェクトに変換します。次の 2 つのパラメータはオフセットとデータ数です。これは 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 または負の数の場合など、他のテストを自分で検出することもできます。これ以上は書きませんが、既存の知識に基づいて結果を推測し、その後、独自のコードを書いて結果が期待どおりであることを確認することができ、学習効果は非常に高いです。 (以下のテストコードリンクにテストがあり、その結果、落とし穴があります)

总结

一个功能使用了三种方式来实现,这就是代码的魅力。至于哪个好哪个坏我们不多做评价,一切都是以业务为核心来进行选取。类似的功能虽说并不常见,但很多项目里都会遇到,比如说后台用户组管理就会非常常见,一般来说后台用户分组如果不是特别大型的 ERP 项目都不会很多,但有时候也会达到需要分页的程度,这时候,我们就可以考虑考虑使用今天所学的知识来做咯!

测试代码:

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

参考文档:

https://www.php.net/manual/zh/function.array-slice.php
https://www.php.net/manual/zh/function.array-chunk.php
https://www.php.net/limititerator

推荐学习:《PHP视频教程

以上がPHP での配列ページング実装の詳細な説明 (非データベース)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。