検索
ホームページバックエンド開発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 <p>\$data がデータベースから取得されたすべてのデータ、または PHP コードに記述されたデータであると仮定します。次に、受信したリクエスト パラメータとして $p を設定し、現在アクセスされているページは 2 ページ目となります。 $currentPage はオフセット補正のクエリに使用されます。コード開発の世界では、添字インデックスはすべて 0 から始まるため、受け取ったパラメーターを 1 つ減らす必要があります。もちろん、フロントエンドによって渡されるパラメータを設定して、最初のページとして 0 を使用することもできます。多くは説明しませんが、正式に勉強したり、開発プロジェクトに参加したりしたことがある方であれば、誰でもその意味を理解できると思います。 </p><p>次に、現在のページに表示される情報の数 $pageSize を定義します。つまり、3 つのデータのみが取得されます。最後に、MySQL の LIMIT のパラメーターに似たオフセットを計算しました。その機能は、どの項目からクエリを開始するかを指示し、$pageSize を使用して項目数をクエリすることです。このようにして、現在のページに対応するデータを取得できます。 (ページングの原理は説明できたようです) </p><h2 id="array-slice">array_slice</h2><p>最初の、最も基本的で最も一般的なページング方法は、array_slice() 関数を使用することです。その機能は、配列からコンテンツの一部をインターセプトし、このコンテンツの配列を返すことです。 </p><pre class="brush:php;toolbar:false">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 サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
PHP:サーバー側のスクリプト言語の紹介PHP:サーバー側のスクリプト言語の紹介Apr 16, 2025 am 12:18 AM

PHPは、動的なWeb開発およびサーバー側のアプリケーションに使用されるサーバー側のスクリプト言語です。 1.PHPは、編集を必要とせず、迅速な発展に適した解釈言語です。 2。PHPコードはHTMLに組み込まれているため、Webページの開発が簡単になりました。 3。PHPプロセスサーバー側のロジック、HTML出力を生成し、ユーザーの相互作用とデータ処理をサポートします。 4。PHPは、データベースと対話し、プロセスフォームの送信、サーバー側のタスクを実行できます。

PHPとWeb:その長期的な影響を調査しますPHPとWeb:その長期的な影響を調査しますApr 16, 2025 am 12:17 AM

PHPは過去数十年にわたってネットワークを形成しており、Web開発において重要な役割を果たし続けます。 1)PHPは1994年に発信され、MySQLとのシームレスな統合により、開発者にとって最初の選択肢となっています。 2)コア関数には、動的なコンテンツの生成とデータベースとの統合が含まれ、ウェブサイトをリアルタイムで更新し、パーソナライズされた方法で表示できるようにします。 3)PHPの幅広いアプリケーションとエコシステムは、長期的な影響を促進していますが、バージョンの更新とセキュリティの課題にも直面しています。 4)PHP7のリリースなど、近年のパフォーマンスの改善により、現代の言語と競合できるようになりました。 5)将来的には、PHPはコンテナ化やマイクロサービスなどの新しい課題に対処する必要がありますが、その柔軟性とアクティブなコミュニティにより適応性があります。

なぜPHPを使用するのですか?利点と利点が説明されましたなぜPHPを使用するのですか?利点と利点が説明されましたApr 16, 2025 am 12:16 AM

PHPの中心的な利点には、学習の容易さ、強力なWeb開発サポート、豊富なライブラリとフレームワーク、高性能とスケーラビリティ、クロスプラットフォームの互換性、費用対効果が含まれます。 1)初心者に適した学習と使用が簡単。 2)Webサーバーとの適切な統合および複数のデータベースをサポートします。 3)Laravelなどの強力なフレームワークを持っています。 4)最適化を通じて高性能を達成できます。 5)複数のオペレーティングシステムをサポートします。 6)開発コストを削減するためのオープンソース。

神話を暴く:PHPは本当に死んだ言語ですか?神話を暴く:PHPは本当に死んだ言語ですか?Apr 16, 2025 am 12:15 AM

PHPは死んでいません。 1)PHPコミュニティは、パフォーマンスとセキュリティの問題を積極的に解決し、PHP7.xはパフォーマンスを向上させます。 2)PHPは最新のWeb開発に適しており、大規模なWebサイトで広く使用されています。 3)PHPは学習しやすく、サーバーはうまく機能しますが、タイプシステムは静的言語ほど厳格ではありません。 4)PHPは、コンテンツ管理とeコマースの分野で依然として重要であり、エコシステムは進化し続けています。 5)OpcacheとAPCを介してパフォーマンスを最適化し、OOPと設計パターンを使用してコードの品質を向上させます。

PHP対Pythonの議論:どちらが良いですか?PHP対Pythonの議論:どちらが良いですか?Apr 16, 2025 am 12:03 AM

PHPとPythonには独自の利点と短所があり、選択はプロジェクトの要件に依存します。 1)PHPは、Web開発に適しており、学習しやすく、豊富なコミュニティリソースですが、構文は十分に近代的ではなく、パフォーマンスとセキュリティに注意を払う必要があります。 2)Pythonは、簡潔な構文と学習が簡単なデータサイエンスと機械学習に適していますが、実行速度とメモリ管理にはボトルネックがあります。

PHPの目的:動的なWebサイトの構築PHPの目的:動的なWebサイトの構築Apr 15, 2025 am 12:18 AM

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

PHP:データベースとサーバー側のロジックの処理PHP:データベースとサーバー側のロジックの処理Apr 15, 2025 am 12:15 AM

PHPはMySQLIおよびPDO拡張機能を使用して、データベース操作とサーバー側のロジック処理で対話し、セッション管理などの関数を介してサーバー側のロジックを処理します。 1)MySQLIまたはPDOを使用してデータベースに接続し、SQLクエリを実行します。 2)セッション管理およびその他の機能を通じて、HTTPリクエストとユーザーステータスを処理します。 3)トランザクションを使用して、データベース操作の原子性を確保します。 4)SQLインジェクションを防ぎ、例外処理とデバッグの閉鎖接続を使用します。 5)インデックスとキャッシュを通じてパフォーマンスを最適化し、読みやすいコードを書き、エラー処理を実行します。

PHPでのSQL注入をどのように防止しますか? (準備された声明、PDO)PHPでのSQL注入をどのように防止しますか? (準備された声明、PDO)Apr 15, 2025 am 12:15 AM

PHPで前処理ステートメントとPDOを使用すると、SQL注入攻撃を効果的に防ぐことができます。 1)PDOを使用してデータベースに接続し、エラーモードを設定します。 2)準備方法を使用して前処理ステートメントを作成し、プレースホルダーを使用してデータを渡し、メソッドを実行します。 3)結果のクエリを処理し、コードのセキュリティとパフォーマンスを確保します。

See all articles

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Mac版

SublimeText3 Mac版

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