ホームページ  >  記事  >  バックエンド開発  >  PHP の IteratorIterator と RecursiveIteratorIterator の主な違いは何ですか?

PHP の IteratorIterator と RecursiveIteratorIterator の主な違いは何ですか?

DDD
DDDオリジナル
2024-11-20 12:21:10890ブラウズ

What are the key differences between IteratorIterator and RecursiveIteratorIterator in PHP?

PHP では RecursiveIteratorIterator はどのように機能しますか?

PHP の RecursiveIteratorIterator は、ツリー トラバーサルをサポートするイテレータの実装です。これにより、Wikipedia の Iterator 記事で定義されているイテレータの一般原則とパターンと同様に、RecursiveIterator インターフェイスを実装するコンテナ オブジェクトのトラバースが可能になります。

線形オブジェクトのトラバースを容易にする IteratorIterator とは異なり、RecursiveIteratorIterator はツリー構造のトラバースに重点を置いています。オブジェクトの。 IteratorIterator は任意の Traversable を処理できますが、RecursiveIteratorIterator は特に RecursiveIterators をターゲットにし、ツリー状のデータ構造の包括的な走査を可能にします。

主な違いを理解する

  1. ターゲット コンテナ: IteratorIterator は任意の Traversable オブジェクトで動作しますが、RecursiveIteratorIterator は RecursiveIterators で動作します。
  2. Traversal Types: IteratorIterator は線形トラバーサルを維持し、オブジェクトを順番に反復処理できます。ただし、RecursiveIteratorIterator を使用すると、順序付けられたツリー構造内のすべてのノードを走査できます。
  3. サブ反復子スタック: RecursiveIteratorIterator は反復子のスタックを維持し、ツリーのネストされたサブ反復子を効果的に走査できます。 。 IteratorIterator はそのような構造を必要としません。
  4. 反復順序: RecursiveIteratorIterator は、SELF_FIRST (子の前に親を最初にリストする) や CHILD_FIRST (逆の順序) など、走査の順序を制御するさまざまなモードを提供します。 。 IteratorIterator にはそのようなモード仕様はありません。

実際の例: ディレクトリ ツリー トラバーサル

次の構造を持つディレクトリ リストを考えてみましょう:

[tree]
    ├ dirA
    └ fileA

IteratorIterator を使用する、ディレクトリの直接の内容を走査できます:

$dir  = new DirectoryIterator($path);
foreach ($dir as $file) {
    echo " ├ $file\n";
}

出力:

 ├ .
 ├ ..
 ├ dirA
 ├ fileA

ネストされたディレクトリを含むツリー全体を走査するには、RecursiveIteratorIterator:

が必要です。
$dir  = new RecursiveDirectoryIterator($path);
$files = new RecursiveIteratorIterator($dir);
foreach ($files as $file) {
    echo " ├ $file\n";
}

出力:

 ├ tree\.
 ├ tree\..
 ├ tree\dirA
 ├ tree\dirA\.
 ├ tree\dirA\..
 ├ tree\dirA\fileB
 ├ tree\dirA\fileC
 ├ tree\fileA

カスタム デコレーターの実装

RecursiveTreeIterator の出力を拡張するには、ベース名の抽出を処理するデコレーター クラスを作成できます。このデコレータは RecursiveDirectoryIterator の代わりに使用でき、目的の出力を提供します。

$lines = new RecursiveTreeIterator(
    new DiyRecursiveDecorator($dir)
);
$unicodeTreePrefix($lines);
echo "[$path]\n", implode("\n", iterator_to_array($lines));

出力:

[tree]
 ├ dirA
 │ ├ dirB
 │ │ └ fileD
 │ ├ fileB
 │ └ fileC
 └ fileA

RecursiveIteratorIterator のニュアンスと IteratorIterator との違いを理解することで、次のことが可能になります。階層ディレクトリやオブジェクト グラフなどの複雑なデータ構造を効果的に横断します。

以上がPHP の IteratorIterator と RecursiveIteratorIterator の主な違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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