ホームページ >バックエンド開発 >PHPチュートリアル >SPL Iteratorsの使用、パート1
コアポイント
最初に「反復」という用語と接触し、SPLに関連する多数のカテゴリを見たとき、私は少し圧倒されました。反復は複雑すぎて理解できないようです。しかし、私はすぐに、それがプログラマーが行ってきた豪華な運用声明であることに気付きました。 PHPを使用する場合、おそらく配列を使用しています。配列を使用している場合、その要素を繰り返して間違いなく繰り返しました。任意のコードを見ると、ほぼ確実にforeach
ループを見つけることができます。はい、反復は値のリストを通過するプロセスにすぎません。イテレーターは、リストを通過するオブジェクトであり、アレイ、ディレクトリリスト、またはデータベースの結果セットでもあります。このシリーズの最初の部分では、標準のPHPライブラリ(SPL)の組み込みクラスのいくつかを反復とどのように活用するかを紹介します。 SPLには多数の反復器が含まれており、コードでそれらを使用するとコード効率が向上し、ほとんどの場合、コードをより読みやすくします。
foreach
foreach
iteration array
私があなたに紹介したい最初のイテレーターはarrayiteratorです。コンストラクターは引数として配列を取り、それをトラバースするために使用できるメソッドを提供します。例は次のとおりです。
<code class="language-php"><?php // 一个数组(使用PHP 5.4的新简写法) $arr = ["sitepoint", "phpmaster", "buildmobile", "rubysource", "designfestival", "cloudspring"]; // 创建一个新的ArrayIterator并传入数组 $iter = new ArrayIterator($arr); // 遍历对象 foreach ($iter as $key => $value) { echo $key . ": " . $value . "<br>"; }</code>
上記のコードの出力は次のとおりです
<code>0: sitepoint 1: phpmaster 2: buildmobile 3: rubysource 4: designfestival 5: cloudspring</code>通常、ArrayObject(特定のコンテキストでオブジェクトを配列として処理できるクラス)を使用します。
ループを使用するか、arrayiterator :: getiterator()を直接呼び出すと、自動的にアレイテレーターが作成されます。 ArrayObjectとArrayiteratorは、このコンテキストでArrayのように動作しますが、それらは依然としてオブジェクトであることに注意してください。 Arrayiteratorは簡単に使用できますが、1次元配列のみです。多次元配列があり、ネストされたアレイを再帰的に反復的に繰り返したい場合があります。この場合、recursivearrayiteratorを使用できます。一般的なシナリオは、foreach
ループをネストするか、再帰関数を作成して、多次元配列内のすべてのアイテムを確認することです。たとえば、sort()
array_keys()
foreach
上記のコードの出力は次のとおりです
<code class="language-php"><?php // 一个多维数组 $arr = [ ["sitepoint", "phpmaster"], ["buildmobile", "rubysource"], ["designfestival", "cloudspring"], "not an array" ]; // 遍历对象 foreach ($arr as $key => $value) { // 检查数组 if (is_array($value)) { foreach ($value as $k => $v) { echo $k . ": " . $v . "<br>"; } } else { echo $key . ": " . $value . "<br>"; } }</code>よりエレガントな方法は、recursivearrayiterator:
を使用することです
<code>0: sitepoint 1: phpmaster 0: buildmobile 1: rubysource 0: designfestival 1: cloudspring 3: not an array</code>出力は前の例と同じです。ここで再帰文字インスタンスを作成し、それを再usivearrayateratorオブジェクトに渡す必要があることに注意してください。そうしないと、ルート配列の値(および設定に基づいて生成された多くの通知)のみが取得されます。多次元配列を使用する場合、現在のエントリを繰り返すことができるため、recursivearrayiteratorを使用する必要がありますが、自分で行うことに依存します。 RecursiveTeratoriteratorは、これを行うデコレーターです。 recursivearrayiteratorを取り、それを繰り返し、見つけられる繰り返しのエントリを反復します(など)。基本的に、それは再帰学者を「フラット」します。 RecursiveTeratoriterator :: getDepth()を呼び出すことにより、追跡のための現在の反復の深さを取得できます。ただし、オブジェクトを返したい場合は、recursivearrayiteratorと再帰タートレーターを使用するように注意してください。
<code class="language-php"><?php ... $iter = new RecursiveArrayIterator($arr); // 遍历对象 // 我们需要创建一个RecursiveIteratorIterator实例 foreach (new RecursiveIteratorIterator($iter) as $key => $value) { echo $key . ": " . $value . "<br>"; }</code>iterationディレクトリリスト
間違いなく、ディレクトリとそのファイルをある時点で反復する必要があり、PHP(やなど)によって提供される組み込み関数を使用してこれを行うことができますが、ディレクトリテーターを使用することもできます。最も単純な形式では、Directoryiteratorは非常に強力ですが、サブクラス化して強化することもできます。 Directoryiteratorを使用してディレクトリを反復する例を以下に示します。
出力は明らかに、指定したパスとディレクトリの内容に依存します。たとえば、scandir()
glob()
<code class="language-php"><?php // 创建新的DirectoryIterator对象 $dir = new DirectoryIterator("/my/directory/path"); // 遍历目录列表 foreach ($dir as $item) { echo $item . "<br>"; }</code>
<code class="language-php"><?php // 一个数组(使用PHP 5.4的新简写法) $arr = ["sitepoint", "phpmaster", "buildmobile", "rubysource", "designfestival", "cloudspring"]; // 创建一个新的ArrayIterator并传入数组 $iter = new ArrayIterator($arr); // 遍历对象 foreach ($iter as $key => $value) { echo $key . ": " . $value . "<br>"; }</code>
<code>0: sitepoint 1: phpmaster 2: buildmobile 3: rubysource 4: designfestival 5: cloudspring</code>
directoryiterator :: isdot()、directoryiterator :: getType()、およびdirectoryiterator :: getSize()など、他の多くのメソッドを使用してください。 DirectoryiteratorとFilteriteratorまたはRegexiteratorを組み合わせて、特定の条件に一致するファイルを返すこともできます。たとえば、
<code class="language-php"><?php // 一个多维数组 $arr = [ ["sitepoint", "phpmaster"], ["buildmobile", "rubysource"], ["designfestival", "cloudspring"], "not an array" ]; // 遍历对象 foreach ($arr as $key => $value) { // 检查数组 if (is_array($value)) { foreach ($value as $k => $v) { echo $k . ": " . $v . "<br>"; } } else { echo $key . ": " . $value . "<br>"; } }</code>
SPLは、RecursivearRayiteratorと同じ方法で使用されるRecursivedirectoryiteratorも提供します。 Directoriesを再帰的に通過する機能には、有効なディレクトリとファイルをチェックするための多くの条件付きチェックが含まれることがよくありますが、Recursivedirectoryiteratorはほとんどの作業を行い、クリーナーコードになります。ただし、警告があります。 Recursivedirectoryiteratorは、空のディレクトリを返しません。
<code>0: sitepoint 1: phpmaster 0: buildmobile 1: rubysource 0: designfestival 1: cloudspring 3: not an array</code>
私の出力は次のように似ています:
<code class="language-php"><?php ... $iter = new RecursiveArrayIterator($arr); // 遍历对象 // 我们需要创建一个RecursiveIteratorIterator实例 foreach (new RecursiveIteratorIterator($iter) as $key => $value) { echo $key . ": " . $value . "<br>"; }</code>
概要
私が最初に思っていたほど複雑ではないことに気づいてくれることを願っています。それは私たちがプログラマーが毎日行っていることです。この記事では、IterationとSPLが提供するクラスのいくつかを導入して、イテレーションをより簡単かつ堅牢にしました。もちろん、私は利用可能なクラスのサンプルのごく一部のみを扱っています。 SPLは「標準」ライブラリです。時々、これらのクラスが一般的すぎると感じることがあり、常にあなたのニーズを満たすとは限りません。この場合、これらのクラスを簡単に拡張して、独自の機能を追加したり、必要に応じて既存の機能を調整したりできます。このシリーズの次の部分では、SPLインターフェイスを使用して、配列のように移動してアクセスできる独自のカスタムクラスを作成する方法を紹介します。 Mushakesa / Shutterstockの写真
SPL Iteratorsの使用に関するFAQ PHPのSPLとは何ですか、そしてなぜそれが重要なのですか? SPLは標準のPHPライブラリを表しています。これは、一般的な問題を解決するために設計された一連のインターフェイスとクラスです。 SPLは、複雑なタスクをより効率的に処理するために使用できる多くのデータ構造、インターフェイス、および例外を提供します。それは、あなたが書く必要があるコードの量を減らし、パフォーマンスを改善し、コードを読みやすくしやすくするのに役立つため、重要です。SPL Iteratorは、データセットを繰り返すために使用されます。 SPL Iteratorを使用するには、最初にIteratorクラスのインスタンスを作成する必要があります。その後、イテレーターの方法を使用してコレクションを反復させることができます。たとえば、現在のアイテムを取得して
メソッドを使用して、
current()
spl iteratorsの例は何ですか? next()
valid()
さまざまな種類には、特定の目的のために設計されたさまざまな種類があります。いくつかの例には、アレイターター(アレイ上の反復)が含まれます(ディレクトリの内容を反復します)。
Filteriteratorクラスを使用してデータをフィルタリングできます。このクラスでは、コレクション内の各アイテムに適用されるカスタムフィルターを定義できます。フィルターを通過するアイテムのみがイテレーターによって返されます。
arrayObjectクラスを使用してデータを並べ替えることができます。このクラスは、コレクション内のアイテムを並べ替えるためのasort()
メソッドを提供します。また、カスタム比較関数を使用してuasort()
メソッドを使用してアイテムを並べ替えることもできます。
SPL例外は、SPL専用に設計された例外タイプです。それらは、SPLを使用するときに発生するエラーに対処する方法を提供します。 SPLの例外を使用するには、try
ブロックに投げるだけでcatch
ブロックでキャッチします。
SPLを使用して配列を処理する方法は?
SPLを使用してデータ構造を処理する方法は?
以上がSPL Iteratorsの使用、パート1の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。