ホームページ  >  記事  >  バックエンド開発  >  データベースを使用せずに PHP で配列ページングを実装する方法

データベースを使用せずに PHP で配列ページングを実装する方法

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-06-15 17:34:051326ブラウズ

この記事では、データベースを使用せずに PHP で配列ページングを実装する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

データベースを使用せずに PHP で配列ページングを実装する方法

PHP での配列ページングの実装 (非データベース)

日々の開発ビジネス環境では、通常、ページング機能を実装するには 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

推荐学习:php视频教程

以上がデータベースを使用せずに PHP で配列ページングを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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