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

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

藏色散人
リリース: 2023-04-10 09:06:01
転載
2172 人が閲覧しました

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

現時点では、実際には毎回データベースにクエリを実行する必要はなく、1 回のクエリですべてのデータをフェッチし、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 を設定し、現在アクセスされているページは 2 ページ目となります。 $currentPage はオフセット補正のクエリに使用されます。コード開発の世界では、添字インデックスはすべて 0 から始まるため、受け取ったパラメーターを 1 つ減らす必要があります。もちろん、フロントエンドによって渡されるパラメータを設定して、最初のページとして 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() 関数には 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 サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート