Quelles sont les principales différences entre IteratorIterator et RecursiveIteratorIterator en PHP ?

DDD
Libérer: 2024-11-20 12:21:10
original
889 Les gens l'ont consulté

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

Comment fonctionne RecursiveIteratorIterator en PHP ?

RecursiveIteratorIterator de PHP est une implémentation d'un itérateur qui prend en charge la traversée d'arborescence. Il permet la traversée d'objets conteneurs implémentant l'interface RecursiveIterator, similaire aux principes généraux et aux modèles d'itérateurs définis dans l'article Wikipédia d'Iterator.

Contrairement à IteratorIterator, qui facilite la traversée linéaire d'objets, RecursiveIteratorIterator se concentre sur la traversée d'une structure arborescente. d'objets. Bien qu'IteratorIterator puisse gérer n'importe quel Traversable, RecursiveIteratorIterator cible spécifiquement les RecursiveIterators, permettant un parcours complet de structures de données arborescentes.

Comprendre les principales différences

  1. Conteneur cible : IteratorIterator fonctionne sur n'importe quel objet Traversable, tandis que RecursiveIteratorIterator fonctionne avec RecursiveIterators.
  2. Types de parcours : IteratorIterator maintient un parcours linéaire, permettant une itération sur les objets dans un ordre séquentiel. RecursiveIteratorIterator, cependant, permet de parcourir tous les nœuds dans une structure arborescente ordonnée.
  3. Pile de sous-itérateurs : RecursiveIteratorIterator maintient une pile d'itérateurs, lui permettant de parcourir efficacement les sous-itérateurs imbriqués d'un arbre. . IteratorIterator ne nécessite pas une telle structure.
  4. Ordre d'itération : RecursiveIteratorIterator fournit différents modes pour contrôler l'ordre de parcours, notamment SELF_FIRST (listant d'abord le parent avant les enfants) et CHILD_FIRST (ordre opposé) . IteratorIterator n'a pas de spécification de mode de ce type.

Exemple concret : traversée de l'arborescence de répertoires

Considérez une liste de répertoires avec la structure suivante :

[tree]
    ├ dirA
    └ fileA
Copier après la connexion

Avec IteratorIterator , vous pouvez parcourir le contenu immédiat du répertoire :

$dir  = new DirectoryIterator($path);
foreach ($dir as $file) {
    echo " ├ $file\n";
}
Copier après la connexion

Sortie :

 ├ .
 ├ ..
 ├ dirA
 ├ fileA
Copier après la connexion

Pour parcourir l'arborescence entière, y compris les répertoires imbriqués, vous auriez besoin du RecursiveIteratorIterator :

$dir  = new RecursiveDirectoryIterator($path);
$files = new RecursiveIteratorIterator($dir);
foreach ($files as $file) {
    echo " ├ $file\n";
}
Copier après la connexion

Sortie :

 ├ tree\.
 ├ tree\..
 ├ tree\dirA
 ├ tree\dirA\.
 ├ tree\dirA\..
 ├ tree\dirA\fileB
 ├ tree\dirA\fileC
 ├ tree\fileA
Copier après la connexion

Implémentation d'un décorateur personnalisé

Pour améliorer la sortie du RecursiveTreeIterator, vous pouvez créer une classe de décorateur qui gère l'extraction du nom de base. Ce décorateur peut être utilisé à la place de RecursiveDirectoryIterator et fournit le résultat souhaité :

$lines = new RecursiveTreeIterator(
    new DiyRecursiveDecorator($dir)
);
$unicodeTreePrefix($lines);
echo "[$path]\n", implode("\n", iterator_to_array($lines));
Copier après la connexion

Sortie :

[tree]
 ├ dirA
 │ ├ dirB
 │ │ └ fileD
 │ ├ fileB
 │ └ fileC
 └ fileA
Copier après la connexion

En comprenant les nuances de RecursiveIteratorIterator et en quoi il diffère de IteratorIterator, vous pouvez parcourir efficacement des structures de données complexes, telles que des répertoires hiérarchiques ou des graphiques d'objets.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal