×
Función Glob() de php

Función Glob() de php para recorrer directorios

¿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/

2 Comments to “Función Glob() de php para recorrer directorios”

  1. Jorge dice: Responder

    Te pasaste!!! jajaja… ahora voy un paso mas adelante!!!

    1. Bueno, esperamos haberte ayudado.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

SUBIR