SPL Iteratorsの使用、パート1

Joseph Gordon-Levitt
Joseph Gordon-Levittオリジナル
2025-02-27 10:14:10234ブラウズ

Using SPL Iterators, Part 1

コアポイント

  • 反復は、プログラミングの値のリストを通過する一般的なプロセスです。 PHPでは、イテレーターは、配列、ディレクトリリスト、データベース結果セットなどのリストを通過するオブジェクトです。
  • 標準のPHPライブラリ(SPL)は、コードをより効率的で読みやすくする多数の反復器を提供します。 SPLイテレーターの使用は、単純な配列を超えて大量のデータまたは複雑な構造を扱う場合に特に有利です。
  • ArrayiteratorとRecursivearRayiteratorは、アレイを繰り返すために使用される2つのSPL反復剤です。 Arrayiteratorは1次元アレイに使用され、再usivearrayiteratorは多次元アレイに使用されます。
  • directoryiteratorと再usivedirectoryiteratorは、ディレクトリリストを通過するために使用されるSPL反復です。 Directoryiteratorを使用してディレクトリを繰り返すことができますが、Recursivedirectoryiteratorは再帰的なディレクトリを横断するために使用できます。

最初に「反復」という用語と接触し、SPLに関連する多数のカテゴリを見たとき、私は少し圧倒されました。反復は複雑すぎて理解できないようです。しかし、私はすぐに、それがプログラマーが行ってきた豪華な運用声明であることに気付きました。 PHPを使用する場合、おそらく配列を使用しています。配列を使用している場合、その要素を繰り返して間違いなく繰り返しました。任意のコードを見ると、ほぼ確実にforeachループを見つけることができます。はい、反復は値のリストを通過するプロセスにすぎません。イテレーターは、リストを通過するオブジェクトであり、アレイ、ディレクトリリスト、またはデータベースの結果セットでもあります。このシリーズの最初の部分では、標準のPHPライブラリ(SPL)の組み込みクラスのいくつかを反復とどのように活用するかを紹介します。 SPLには多数の反復器が含まれており、コードでそれらを使用するとコード効率が向上し、ほとんどの場合、コードをより読みやすくします。

を使用する時期と理由 ご覧のとおり、反復的な反復オブジェクトは基本的に反復配列と同じであるため、多くの人が最初に配列に固執する方が簡単であるかどうかを知りたいと思っています。ただし、イテレーターの真の利点は、単純な配列よりも大量のデータまたはより複雑なデータを横断することになる場合です。 ループは、渡された配列をコピーします。大量のデータに取り組んでいる場合、ループで大きな配列を使用するたびにコピーしますが、これは望ましくない場合があります。 SPL Iteratorはリストをカプセル化し、一度に1つの要素のみの可視性を公開するため、より効率的になります。イテレーターは、データプロバイダーを作成する際の良い構成要素です。これは、データの読み込みを遅らせることができるためです。ここでの怠zyな読み込みは、必要に応じて必要なデータを取得するだけです。また、ユーザーが利用できるようにする前に、処理されるデータを操作(フィルター、変換など)することもできます。ただし、イテレーターを使用するという決定は常にあなたの裁量であります。イテレーターには多くの利点がありますが、場合によっては(アレイセットが小さいなど)、不必要なオーバーヘッドにつながる可能性があります。それらを使用する時期はあなた次第です。

foreachforeachiteration 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()

directoryiteratorや他の多くのSPL反復因子については、例外を使用してエラーを処理できることを忘れないでください。
<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は、複雑なタスクをより効率的に処理するために使用できる多くのデータ構造、インターフェイス、および例外を提供します。それは、あなたが書く必要があるコードの量を減らし、パフォーマンスを改善し、コードを読みやすくしやすくするのに役立つため、重要です。

phpでspl iteratorを使用する方法は?

SPL Iteratorは、データセットを繰り返すために使用されます。 SPL Iteratorを使用するには、最初にIteratorクラスのインスタンスを作成する必要があります。その後、イテレーターの方法を使用してコレクションを反復させることができます。たとえば、現在のアイテムを取得して

メソッドを使用して、

メソッドを使用して次のアイテムに移動し、

メソッドを使用して、より多くのアイテムがあるかどうかを確認できます。

current() spl iteratorsの例は何ですか? next() valid()さまざまな種類には、特定の目的のために設計されたさまざまな種類があります。いくつかの例には、アレイターター(アレイ上の反復)が含まれます(ディレクトリの内容を反復します)。

SPL Iteratorを使用してデータをフィルタリングする方法は?

Filteriteratorクラスを使用してデータをフィルタリングできます。このクラスでは、コレクション内の各アイテムに適用されるカスタムフィルターを定義できます。フィルターを通過するアイテムのみがイテレーターによって返されます。

spl iteratorを使用してデータを並べ替える方法は?

arrayObjectクラスを使用してデータを並べ替えることができます。このクラスは、コレクション内のアイテムを並べ替えるためのasort()メソッドを提供します。また、カスタム比較関数を使用してuasort()メソッドを使用してアイテムを並べ替えることもできます。

SPL例外は何ですか?また、どのように使用しますか?

SPL例外は、SPL専用に設計された例外タイプです。それらは、SPLを使用するときに発生するエラーに対処する方法を提供します。 SPLの例外を使用するには、tryブロックに投げるだけでcatchブロックでキャッチします。

SPLを使用してファイルを読み書きする方法は?

SPLを使用してディレクトリを処理する方法は?

directoryiteratorクラスを使用してディレクトリを処理できます。このクラスは、ディレクトリを開き、内容を読み取り、ディレクトリを閉じる方法を提供します。また、ファイルがディレクトリであるかどうかを確認し、ファイルのサイズ、タイプ、および変更時間を取得する方法も提供します。

SPLを使用して配列を処理する方法は?

ArrayObjectおよびArrayiteratorクラスを使用して配列を処理できます。これらのクラスは、配列を作成し、アイテムを追加し、アイテムを削除し、アイテムを繰り返す方法を提供します。また、配列を並べ替えて、アレイにアイテムが存在するかどうかを確認する方法も提供します。

SPLを使用してデータ構造を処理する方法は?

SPLが提供するさまざまなデータ構造クラスを使用してデータ構造を処理できます。これらのクラスには、Splstack、Splqueue、Splheap、SplpriorityQueueが含まれます。各クラスは、データ構造を作成し、アイテムを追加し、アイテムを削除し、アイテムを繰り返す方法を提供します。

以上がSPL Iteratorsの使用、パート1の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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