PHP5 ajoute Iterator, un ensemble d'interfaces prêtes à l'emploi qui aident à naviguer et à gérer les structures de données hiérarchiques. C'est l'une des nouvelles fonctionnalités les plus intéressantes de PHP5.
Ces itérateurs réduisent considérablement le code requis pour traiter une arborescence de documents XML ou une collection de fichiers. Un grand nombre d'itérateurs sont utilisés dans PHP5, notamment ArrayIterator, CachingIterator, LimitIterator, RecursiveIterator, SimpleXMLIterator et DirectoryIterator.
DirectoryIterator peut traiter rapidement et efficacement les fichiers du répertoire. Avec un peu plus de créativité dans le processus de codage, DirectoryIterator peut également être utilisé pour traiter de manière récursive des arborescences de répertoires imbriquées. Les deux tâches peuvent être accomplies en utilisant seulement quelques lignes de code, ce qui constitue une amélioration significative par rapport à l'approche « standard ».
Traitement d'un répertoire à un seul niveau Nous commençons d'abord par une tâche simple : traiter un répertoire à un seul niveau. Entrez (ou copiez) le code suivant (Listing A), en modifiant le chemin du répertoire pour refléter la configuration locale :
Listing A
<?php$it = new DirectoryIterator("/tmp/mystuff");foreach($it as $file) {if ( !$it->isDot()) {echo $file . "n";}}?>Affichez la sortie de ce code dans le navigateur, vous verrez une liste de fichiers dans le répertoire spécifié. Comment est-ce arrivé ? DirectoryIterator fournit une interface prédéterminée pour reformuler le contenu d'un répertoire ; une fois l'emplacement du répertoire cible échantillonné, il peut être traité comme un tableau PHP standard, chaque élément représentant un fichier dans le répertoire. Notez qu'il utilise la méthode isDot() pour filtrer respectivement les répertoires "." et ".."
Gestion des arborescences de répertoires imbriquées La gestion récursive d'une arborescence de répertoires imbriquées est presque aussi simple. Dans ce cas, DirectoryIterator doit vérifier chaque objet qu'il rencontre dans le répertoire à un seul niveau pour déterminer s'il s'agit d'un fichier ou d'un répertoire. S'il s'agit d'un répertoire, descendez d'un niveau plus loin pour vérifier le contenu du niveau suivant. Cela peut sembler assez complexe et, dans le passé, il fallait généralement plus de 15 lignes de code.
Cependant, avec PHP5, vous n'avez besoin que de deux nouveaux itérateurs : RecursiveIterator et RecursiveIteratorIterator, qui combinent toutes les fonctionnalités ci-dessus. Voir Liste B :
Liste B
<?php$it = new RecursiveDirectoryIterator("/tmp");foreach(new RecursiveIteratorIterator($it) as $file) {echo $file ;}?>À ce stade, entrez. le résultat Tous les fichiers et répertoires sous le répertoire de départ seront répertoriés. Inutile de dire que cette interface récursive intégrée est très pratique si vous devez traiter tous les fichiers sous un niveau de répertoire spécifique - par exemple, compresser de manière récursive une arborescence de répertoires ou modifier les autorisations de groupe/propriétaire d'une série de fichiers imbriqués.
Application réelle : impression d'une arborescence de répertoires L'impression d'une arborescence de répertoires graphique est une application courante de la récursion de répertoires. Utiliser Iterator pour gérer cette tâche est très simple, car la documentation de la classe Iterator contient une classe d'instance écrite spécifiquement pour cette application. DirectoryTreeIterator (merci à Marcus Boerger) apporte d'autres améliorations au RecursiveIteratorIterator évoqué précédemment, en particulier les balises ASCII représentant la profondeur et la position dans la structure arborescente.
Le listing C illustre l'utilisation de DirectoryTreeIterator.
Listing C
<?php$it = new DirectoryTreeIterator("/tmp/cookbook/");foreach($it as $path) {echo $path
. -ch01|-recette01 |-exemple01.php| -exemple02.php | Pour mieux comprendre la valeur de ces DirectoryIterators, essayez de coder les trois applications illustrées dans ce didacticiel à l'aide de fonctions de fichiers et de répertoires standard.