PHP5 agrega Iterator, un conjunto de interfaces listas para usar que ayudan a navegar y manejar estructuras de datos jerárquicas. Esta es una de las características nuevas más interesantes de PHP5.
Estos iteradores reducen significativamente el código necesario para procesar un árbol de documentos XML o una colección de archivos. En PHP5 se utiliza una gran cantidad de iteradores, incluidos ArrayIterator, CachingIterator, LimitIterator, RecursiveIterator, SimpleXMLIterator y DirectoryIterator.
DirectoryIterator puede procesar archivos en el directorio de manera rápida y eficiente. Con un poco más de creatividad en el proceso de codificación, DirectoryIterator también se puede utilizar para procesar recursivamente árboles de directorios anidados. Ambas tareas se pueden realizar utilizando sólo unas pocas líneas de código, una mejora significativa con respecto al enfoque "estándar".
Procesamiento de un directorio de un solo nivel Primero comenzamos con una tarea simple: procesar un directorio de un solo nivel. Ingrese (o copie) el siguiente código (Listado A), modificando la ruta del directorio para reflejar la configuración local:
Listado A
<?php$it = new DirectoryIterator("/tmp/mystuff");foreach($it as $file) {if ( !$it->isDot()) {echo $file . "n";}}?>Vea el resultado de este código en el navegador, verá una lista de archivos en el directorio especificado. ¿Cómo sucedió esto? DirectoryIterator proporciona una interfaz predeterminada para reformular el contenido de un directorio; una vez que se muestra la ubicación del directorio de destino, se puede tratar como una matriz PHP estándar, donde cada elemento representa un archivo en el directorio. Tenga en cuenta que utiliza el método isDot () para filtrar los directorios "." y ".." respectivamente.
Manejo de árboles de directorios anidados Manejar recursivamente un árbol de directorios anidados es casi igual de fácil. En este caso, DirectoryIterator necesita verificar cada objeto que encuentra en el directorio de un solo nivel para determinar si es un archivo o un directorio. Si es un directorio, vaya un nivel más profundo para verificar el contenido del siguiente nivel. Esto puede parecer bastante complejo y, en el pasado, normalmente requería más de 15 líneas de código.
Sin embargo, con PHP5, sólo necesitas dos nuevos iteradores: RecursiveIterator y RecursiveIteratorIterator, que combinan todas las características anteriores. Consulte la Lista B:
Lista B
<?php$it = new RecursiveDirectoryIterator("/tmp");foreach(new RecursiveIteratorIterator($it) as $file) {echo $file;}?>En este momento, ingrese. el resultado Se enumerarán todos los archivos y directorios en el directorio de inicio. No hace falta decir que esta interfaz recursiva incorporada es muy conveniente si necesita procesar todos los archivos en un nivel de directorio específico, por ejemplo, comprimir recursivamente un árbol de directorios o modificar los permisos de grupo/propietario de una serie de archivos anidados.
Aplicación de la vida real: Imprimir un árbol de directorios Imprimir un árbol de directorios gráfico es una aplicación común de recursividad de directorios. Usar Iterator para manejar esta tarea es muy simple, porque la documentación de la clase Iterator contiene una clase de instancia escrita específicamente para esta aplicación. DirectoryTreeIterator (gracias a Marcus Boerger) proporciona otras mejoras al RecursiveIteratorIterator discutido anteriormente, en particular etiquetas ASCII que representan la profundidad y la posición en la estructura del árbol.
El Listado C ilustra el uso de DirectoryTreeIterator.
Listado C
<?php$it = new DirectoryTreeIterator("/tmp/cookbook/");foreach($it as $path) {echo $path ;}?>Aquí está parte del resultado que ve:
| -ch01 |-receta01| |-ejemplo01.php| -ejemplo02.php |-receta01| Para comprender mejor el valor de estos DirectoryIterators, intente codificar las tres aplicaciones ilustradas en este tutorial utilizando funciones estándar de archivos y directorios.