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

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

DDD
DDDオリジナル
2024-11-17 16:12:02807ブラウズ

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

PHP の RecursiveIteratorIterator について

概要

RecursiveIteratorIterator は、ツリー トラバーサルを実装する具体的なイテレータです。 。これにより、プログラマーは RecursiveIterator インターフェイスを実装するコンテナ オブジェクトをトラバースできるようになり、オブジェクトの順序付けされたツリー内のノードをループできるようになります。

IteratorIterator と RecursiveIteratorIterator の違い

IteratorIterator はこれも具象イテレータですが、任意の Traversable に対して線形トラバースを実行します。対照的に、RecursiveIteratorIterator では、ツリーを走査するために RecursiveIterator が必要です。これは getInnerIterator() メソッドを通じてサブ反復子 (現在アクティブな反復子) を公開しますが、IteratorIterator は同じメソッドを通じてメイン反復子を公開します。

技術的な違い

  • RecursiveIteratorIterator は入力として RecursiveIterator を受け取りますが、IteratorIterator は任意の Traversable を受け取ります。
  • RecursiveIteratorIterator は親ノードと子ノードの知識を持っていますが、IteratorIterator は持っていません。
  • RecursiveIteratorIterator はイテレータのスタックを維持し、知っています。アクティブなサブイテレータですが、IteratorIterator にはスタックは必要ありません。
  • RecursiveIteratorIterator には IteratorIterator よりも多くのメソッドがあります。

ディレクトリ ツリーの走査の例

これらの反復子の使用法を説明するために、ディレクトリ ツリーを考えてみましょう。

tree
├── dirA
│   ├── dirB
│   │   └── fileD
│   ├── fileB
│   └── fileC
└── fileA
  • IteratorIterator の使用:
$dir = new DirectoryIterator('tree');
foreach ($dir as $file) {
    echo " ├ $file" . PHP_EOL;
}

出力:

 ├ .
 ├ ..
 ├ dirA
 ├ fileA
  • RecursiveIterator の使用Iterator:
$dir = new RecursiveDirectoryIterator('tree');
$files = new RecursiveIteratorIterator($dir);
foreach ($files as $file) {
    echo " ├ $file" . PHP_EOL;
}

出力:

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

カスタマイズTraversal

RecursiveIteratorIterator は、ノードが走査される順序を制御する再帰モードを提供します:

  • LEAVES_ONLY: ファイルのみをリストします
  • SELF_FIRST: 最初にディレクトリをリストし、次にファイルをリストします
  • CHILD_FIRST: 最初にファイルをリストし、次にディレクトリをリストします

結論

RecursiveIteratorIterator は、PHP のツリー状構造を走査するための強力な機能を提供します。そのトラバーサル モードは柔軟性を提供し、そのメタ情報により反復プロセスの高度なカスタマイズが可能になります。

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

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