2011-04-24 16 views
10

Tengo esta función de trabajo que encuentra carpetas y crea una matriz.Obtener carpetas con PHP glob - niveles ilimitados profundidad

function dua_get_files($path) 
{ 
    foreach (glob($path . "/*", GLOB_ONLYDIR) as $filename) 
    { 
     $dir_paths[] = $filename; 
    } 
    return $dir_paths; 
} 

Esta función solo puede encontrar los directorios en la ubicación actual. Quiero encontrar las rutas del directorio en las carpetas secundarias y sus hijos, y así sucesivamente.

La matriz debe seguir siendo una lista plana de rutas de directorio.

Un ejemplo de cómo la matriz de salida debe ser similar

$dir_path[0] = 'path/folder1'; 
$dir_path[1] = 'path/folder1/child_folder1'; 
$dir_path[2] = 'path/folder1/child_folder2'; 
$dir_path[3] = 'path/folder2'; 
$dir_path[4] = 'path/folder2/child_folder1'; 
$dir_path[5] = 'path/folder2/child_folder2'; 
$dir_path[6] = 'path/folder2/child_folder3'; 

Respuesta

14

Si quieres trabajar de forma recursiva en los directorios, debería echar un vistazo a la RecursiveDirectoryIterator.

$path = realpath('/etc'); 

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); 
foreach($objects as $name => $object){ 
    echo "$name\n"; 
} 
+0

Sí, eso funcionó. Edité y agregué el código para que otros lo vean en tu respuesta. –

+0

¿por qué RecursiveDirectoryIterator class? ver mi respuesta –

+0

@Davood porque, usando ese iterador, no hay necesidad de hacer la recursión usted mismo ;-) ;; @Jens su edición está pendiente de aprobación y necesita un "voto de aprobación" más para mostrarse; si no se aprueba pronto, me editaré para agregar lo que publicaste; Gracias ! –

4

Tal vez puedas probar:

function dua_get_files($path) 
{ 
    $data = array(); 
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); 

    foreach ($files as $file) 
    { 
     if (is_dir($file) === true) 
     { 
      $data[] = strval($file); 
     } 
    } 

    return $data; 
} 
+0

Voto abajo, porque esto no usa glob para nada. –

+0

@DennisMeissner: tampoco es la respuesta aceptada, pero aparentemente hace el trabajo. Usar glob para esta tarea es una tontería. –

1

Utilice esta función:

function dua_get_files($path) 
{ 
    $dir_paths = array(); 
    foreach (glob($path . "/*", GLOB_ONLYDIR) as $filename) 
    { 
     $dir_paths[] = $filename; 
     $a = glob("$filename/*", GLOB_ONLYDIR); 
     if(is_array($a)) 
     { 
      $b = dua_get_files("$filename/*"); 
      foreach($b as $c) 
      { 
       $dir_paths[] = $c; 
      } 
     } 
    } 
    return $dir_paths; 
} 
2

Muy extraño - todo el mundo consejos recursividad, pero el ciclo mejor simplemente:

$dir ='/dir'; 
while($dirs = glob($dir . '/*', GLOB_ONLYDIR)) { 
    $dir .= '/*'; 
    if(!$result) { 
    $result = $dirs; 
    } else { 
     $result = array_merge($result, $dirs); 
    } 
} 
0

Si están en un linux/unix, también puedes usar backt icks con el comando find. La búsqueda en el directorio en el sistema de archivos puede llevar mucho tiempo y establecer un ciclo: el comando find del sistema ya está creado para la velocidad y para manejar los bucles del sistema de archivos. En otras palabras, es probable que la llamada al administrador del sistema cueste menos tiempo de CPU que utilizar el propio php para buscar en el árbol del sistema de archivos.

$dirs = `find $path -type d`; 

Recordar para desinfectar la entrada $ ruta, para que otros usuarios no pasan en los nombres de ruta de seguridad comprometer (como desde la url o algo así).

Para ponerlo en una matriz

$dirs = preg_split("/\s*\n+\s*/",`find $path -type d`,-1,PREG_SPLIT_NO_EMPTY); 
0

Puede utilizar la función de php MUNDIALIZA, pero es necesario crear una función recursiva para escanear directorios en profundidad nivel infinito. Luego almacena los resultados en una variable global.

function dua_get_files($path) { 
    global $dir_paths; //global variable where to store the result 
    foreach ($path as $dir) { //loop the input 
     $dir_paths[] = $dir; //can use also "basename($dir)" or "realpath($dir)" 
     $subdir = glob($dir . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR); //use DIRECTORY_SEPARATOR to be OS independent 
     if (!empty($subdir)) { //if subdir is not empty make function recursive 
      dua_get_files($subdir); //execute the function again with current subdir 
     } 
    } 
} 

//usage: 
$path = array('galleries'); //suport absolute or relative path. support one or multiple path 
dua_get_files($path); 
print('<pre>'.print_r($dir_paths,true).'</pre>'); //debug 
Cuestiones relacionadas