目次
array_slice
array_chunk
LimitIterator
パラメータが間違っている場合のパフォーマンス
总结
ホームページ バックエンド開発 PHPチュートリアル PHP での配列ページング実装の詳細な説明 (非データベース)

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

Jun 23, 2021 am 09:35 AM
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
ログイン後にコピー

参考文档:

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHP対Python:違いを理解します PHP対Python:違いを理解します Apr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHPの永続的な関連性:それはまだ生きていますか? PHPの永続的な関連性:それはまだ生きていますか? Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPおよびPython:コードの例と比較 PHPおよびPython:コードの例と比較 Apr 15, 2025 am 12:07 AM

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

PHP対その他の言語:比較 PHP対その他の言語:比較 Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

See all articles