Sugerencia rápida recorrer las carpetas con PHP's Glob ()

¿Sigues usando opendir () para recorrer las carpetas en PHP? ¿No requiere eso un montón de código repetitivo cada vez que desea buscar una carpeta? Por suerte, el glob () de PHP es una solución mucho más inteligente..


Introducción

Este es un ejemplo de cómo hacer eco de cierta información de una carpeta, utilizando la función tradicional opendir ().

 $ dir = "/ etc / php5 /"; // Abra un directorio conocido y continúe leyendo su contenido si (is_dir ($ dir)) if ($ dh = opendir ($ dir)) while (($ file = readdir ($ dh))! == ) echo "filename: $ file: filetype:". tipo de archivo ($ dir. $ archivo). "\norte";  closedir ($ dh);  

Eso debería parecer algo familiar. Podemos acortar masivamente el código anterior con:

 $ dir = "/ etc / php5 / *"; // Abra un directorio conocido y continúe leyendo su contenido foreach (glob ($ dir) como $ file) echo "filename: $ file: filetype:". tipo de archivo ($ archivo). "
";

¿No es eso mucho más fácil? ¿Tienes ganas de aprender cómo funciona el método? Si es así, entonces sigamos adelante.

glob () admite un total de dos argumentos, con el segundo argumento opcional. El primer argumento es la ruta a la carpeta, sin embargo, es un poco más potente que eso..


Paso 1. El primer argumento

Este primer argumento soporta un patrón. Esto significa que puede limitar la búsqueda a tipos de archivos específicos o incluso a varios directorios al mismo tiempo utilizando varios asteriscos "*". Supongamos que tiene un sitio web que permite a los usuarios cargar imágenes (solo porque leí esto). Cada usuario tiene su propia carpeta dentro de la carpeta "userImages". Dentro de estas carpetas hay dos carpetas adicionales, llamadas "HD" y "TN", para imágenes de alta definición (tamaño completo) y para miniaturas. Imaginemos que desea recorrer todas las carpetas "TN" de sus usuarios e imprimir los nombres de archivo. Esto requeriría un fragmento de código relativamente grande si tuviera que usar open_dir (); Sin embargo, con glob (), es fácil..

 foreach (glob ('userImages / * / TN / *') como $ image) echo "Nombre de archivo:". $ imagen. "
";

Esto buscará en userImages / any / TN / any y devolverá una lista de los archivos que coinciden con el patrón.

 Nombre de archivo: userImages / username1 / TN / test.jpg Nombre de archivo: userImages / username1 / TN / test3.jpg Nombre de archivo: userImages / username1 / TN / test5.png Nombre de archivo: userImages / username2 / TN / subfolder Nombre de archivo: userImages / username2 / TN / test2.jpg Nombre de archivo: userImages / username2 / TN / test4.gif Nombre de archivo: userImages / username3 / TN / styles.css 

Incluso podemos llevar las cosas un paso más allá y ser más específicos al incluir un formato de archivo en nuestra declaración foreach:

 foreach (glob ('userImages / * / TN / *. jpg') como $ image) echo "Nombre de archivo:". $ imagen. "
";

Ahora, esto solo devolverá Jpegs..

 Nombre de archivo: userImages / username1 / TN / test.jpg Nombre de archivo: userImages / username1 / TN / test3.jpg Nombre de archivo: userImages / username2 / TN / test2.jpg 

Se pone aún mejor. ¿Qué pasa si, por ejemplo, necesita Jpegs, pero también Gifs; ¿nada más? O ¿qué pasa si desea imprimir sólo los nombres de las carpetas? Aquí es donde entra en juego el segundo argumento..


Paso 2. El Segundo Argumento

El segundo argumento es, como se mencionó anteriormente, opcional. Sin embargo, proporciona un conjunto muy agradable de indicadores opcionales. Esto te permitirá cambiar la forma en que se comporta tu glob ()..

  • GLOB_MARK: Agrega una barra a cada directorio devuelto
  • GLOB_NOSORT: Devuelve los archivos tal como aparecen en el directorio (sin clasificación)
  • GLOB_NOCHECK: Devuelve el patrón de búsqueda si no se encontraron archivos que coincidan con él
  • GLOB_NOESCAPE: Las barras invertidas no citan metacaracteres
  • GLOB_BRACE: Expande a, b, c para que coincida con 'a', 'b' o 'c'
  • GLOB_ONLYDIR: Devuelve solo entradas de directorio que coincidan con el patrón
  • GLOB_ERR: Detener errores de lectura (como directorios ilegibles), los errores predeterminados se ignoran

Como puede ver, los posibles requisitos que señalamos al final del Paso 1 se pueden solucionar fácilmente con GLOB_BRACE:

 foreach (glob ('userImages / * / TN / *. jpg, *. gif', GLOB_BRACE) como $ image) echo "Filename:". $ imagen. "
";

que devolverá esto:

 Nombre de archivo: userImages / username1 / TN / test.jpg Nombre de archivo: userImages / username1 / TN / test3.jpg Nombre de archivo: userImages / username2 / TN / test2.jpg Nombre de archivo: userImages / username2 / TN / test4.gif 

Si deseamos imprimir solo los nombres de las subcarpetas, podríamos usar GLOB_ONLYDIR:

 foreach (glob ('userImages / * / TN / *', GLOB_ONLYDIR) como $ image) echo "Nombre de archivo:". $ imagen. "
";

que se imprimirá:

 Nombre de archivo: userImages / username2 / TN / subfolder 

Conclusión y un ejemplo más

Este método ha estado disponible desde PHP 4.3, sin embargo, no se usa muy a menudo, de forma extraña. No lo aprendí hasta bastante tarde yo mismo. Ahora, a menudo uso glob () al cargar complementos en mi marco:

 foreach (glob ('includes / plugins / *. php') como $ plugin) include_once ($ plugin);  

Eso es todo; Espero que hayan disfrutado de este consejo rápido, y háganme saber si tienen alguna pregunta.!