¿Sigues usando opendir( ) para recorrer las carpetas en PHP? ¿No requieren una gran cantidad de código repetitivo cada vez que deseas buscar una carpeta? Por suerte, la función glob() de PHP es una solución mucho más elegante y rápida.
Introducción
He aquí un ejemplo de alguna información de una carpeta, con la función tradicional opendir( ).
<?php $dir = "/etc/php5/"; // Abrir un directorio conocido, y proceder a leer su contenido if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: $file : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); } } |
Eso debería ser un poco familiar. Pero podemos reducir bastante el código anterior con :
<?php $dir = "/etc/php5/*"; // Abrir un directorio conocido, y proceder a leer su contenido foreach(glob($dir) as $file) { echo "filename: $file : filetype: " . filetype($file) . "<br />"; } ?> |
¿No es mucho más fácil? ¿Deseoso de aprender cómo funciona el método? Si es así, entonces vamos a seguir adelante con ella. El metodo glob() admite un total de dos argumentos, el segundo argumento es opcional. El primer argumento es la ruta a la carpeta, sin embargo, es un poco más poderoso que eso.
Paso 1. El primer argumento
Este primer argumento apoya un patrón. Esto significa que puedes limitar la búsqueda a tipos de archivos específicos, o incluso varios directorios al mismo tiempo, utilizando varios asteriscos ” * “. Supongamos que tienes un sitio web que permite a los usuarios subir imágenes. Cada usuario tiene su propia carpeta dentro de la carpeta “imgenesUsuario “. Dentro de estas carpetas hay dos carpetas adicionales, uana llamada ” HD ” y otra “TN “, para la alta definición (una para tamaño completo de la imagen y la otra para la imagenes en miniatura). Imaginemos que deseamos recorrer todas las carpetas “TN” de todos los usuarios y mostrar los nombres de archivo. Esto requeriría un fragmento relativamente grande de código si utilizaramos la función open_dir(), sin embargo, con glob(), es fácil.
foreach(glob('imgenesUsuario/*/TN/*') as $image) { echo "Filename: " . $image . "<br />"; } |
Esto buscará en la carpeta (imgenesUsuario/todas las carpetas de usuario/en la carpeta TN/ todos los archivos ) y cada una le mostrará una lista de los archivos que coinciden con el patrón.
Filename: imagenesUsuario/usuario1/TN/test.jpg Filename: imagenesUsuario/usuario1/TN/test3.jpg Filename: imagenesUsuario/usuario1/TN/test5.png Filename: imagenesUsuario/usuario2/TN/subfolder Filename: imagenesUsuario/usuario2/TN/test2.jpg Filename: imagenesUsuario/usuario2/TN/test4.gif Filename: imagenesUsuario/usuario3/TN/styles.css |
Incluso podemos tomar las cosas un paso más y ser más específicos mediante la inclusión de un formato de archivo en nuestra declaración foreach:
foreach(glob('imgenesUsuario/*/TN/*.jpg') as $image) { echo "Filename: " . $image . "<br />"; } |
Ahora , esto sólo nos devolverá los archivos cuya extension sea solamente (.jpg)
Filename: imagenesUsuario/usuario1/TN/test.jpg
Filename: imagenesUsuario/usuario1/TN/test3.jpg
Filename: imagenesUsuario/usuario2/TN/test2.jpg
|
Pero aún mejor. ¿Qué pasa si, por ejemplo, necesitamos que nos muestre jpeg y Gif? ¿O qué si usted desea imprimir sólo los nombres de carpeta? Aquí es donde el segundo argumento entra en juego.
Paso 2. El segundo argumento
El segundo argumento es, como se mencionó anteriormente, opcional. Sin embargo, ofrece un conjunto de opciones muy buenas. Nos permitirá cambiar la forma en que el metodo glob() se comporte.
GLOB_MARK: Agrega una barra a cada directorio devuelto
GLOB_NOSORT: Devuelve los archivos tal y como aparecen en el directorio ( sin clasificación )
GLOB_NOCHECK: Devolver el patrón de búsqueda si no hay archivos que coinciden con lo que se encontro
GLOB_NOESCAPE: barras invertidas
GLOB_BRACE: Amplía { a, b , c } para que coincida con ‘ a ‘, ‘ b ‘, o ‘ c ‘
GLOB_ONLYDIR: Muestra sólo las entradas de directorio que coinciden con el patrón
GLOB_ERR: Parar en errores de lectura ( como directorios ilegible s), los errores de omisión son ignorados
Como puedes ver, los requisitos que observamos en la final de la etapa 1 se puede solucionar fácilmente con GLOB_BRACE
foreach(glob('imgenesUsuario/*/TN/{ *.jpg, *.gif }', GLOB_BRACE ) as $image) { echo "Filename: " . $image . "<br />"; } |
Y esto es lo que nos devuelve:
Filename: imagenesUsuario/usuario1/TN/test.jpg
Filename: imagenesUsuario/usuario1/TN/test3.jpg
Filename: imagenesUsuario/usuario2/TN/test2.jpg
Filename: imagenesUsuario/usuario2/TN/test4.gif
|
Si queremos imprimir sólo los nombres de subcarpeta, podríamos usar GLOB_ONLYDIR
foreach(glob('imgenesUsuario/*/TN/*', GLOB_ONLYDIR ) as $image) { echo "Filename: " . $image . "<br />"; } |
y nos imprimira los siguiente:
Filename: imagenesUsuario/usuario1/TN/subcarpeta |
Conclusión y un ejemplo más
Este método ha estado disponible desde PHP 4.3, sin embargo, no se utiliza muy a menudo, extrañamente. Yo no lo aprendí hasta hace muy poco tiempo. Ahora, utilizo a menudo glob() para cargar plugins en mi Framework.
foreach(glob('includes/plugins/*.php') as $plugin) { include_once($plugin); } |
Eso es todo, ¡espero que haya disfrutado!
Fuente: https://desenvolupant.wordpress.com/2011/04/23/recorrer-carpetas-con-glob-en-php/
Te pasaste!!! jajaja… ahora voy un paso mas adelante!!!
Bueno, esperamos haberte ayudado.