2009-06-04 7 views
17

Estoy tratando de colocar algunas carpetas en mi disco duro en una matriz.Arreglo recursivo profundo de estructura de directorios en PHP

Por ejemplo, fotos de vacaciones. Supongamos que tenemos la siguiente estructura:

  • Set 1
    • artículo 1 de Set 1
    • Tema 2 del Conjunto 1
    • artículo ... del Conjunto 1
  • Set 2
    • Subconjunto 1 de Set 2
      • artículo 1 del subconjunto 1 de Set 2
      • artículo ... del subconjunto 1 de Set 2
    • subconjunto 2 de Set 2
    • archivo al azar, no un directorio.
  • Set 3
  • ...

quiero tener algo así, como una matriz.
Significado Tengo 1 gran matriz y en esa matriz hay más matrices. Cada conjunto y subconjunto obtiene su propia matriz.

que estoy tratando de hacer que se vea algo como esto:

Array 
(
    [Set 1] => Array([0] => Item 1 of Set 1, [1] => Item 1 of Set 1,...) 
    [Set 2] => Array([Subnet 1] => Array([0] => Item 1 of Subset 1 of Set 2,[1] => ...), [Subnet 2] => Array([0] => ..., ..., ...), ..., [0] => Random File) 
    [set 3] => Array(...) 
    ... 
) 

me encontré con esto: http://www.the-art-of-web.com/php/dirlist/

Pero eso no es lo que estoy buscando. Me he estado entrometiendo pero no me está dando más que problemas.

Aquí hay un ejemplo, ver fuente para una resolución más grande (sin hacer clic aparentemente ...). Example

+0

Esta pregunta no es un duplicado y no debería haber sido marcada como tal. – Dom

Respuesta

40

recomiendo el uso de DirectoryIterator para construir la matriz

He aquí un fragmento Tiré juntos muy rápido, pero no tienen un entorno de prueba en este momento así que esté preparado para depurarlo.

$fileData = fillArrayWithFileNodes(new DirectoryIterator('/path/to/root/')); 

function fillArrayWithFileNodes(DirectoryIterator $dir) 
{ 
    $data = array(); 
    foreach ($dir as $node) 
    { 
    if ($node->isDir() && !$node->isDot()) 
    { 
     $data[$node->getFilename()] = fillArrayWithFileNodes(new DirectoryIterator($node->getPathname())); 
    } 
    else if ($node->isFile()) 
    { 
     $data[] = $node->getFilename(); 
    } 
    } 
    return $data; 
} 
+0

Recibo este error: Error fatal: se alcanzó el nivel máximo de anidación de funciones de '100', ¡abortando! Y no veo por qué debería conseguir esto ... la mayor anidación que tengo es de 5 niveles. – KdgDev

+1

Ok, tuve la oportunidad de ejecutar esto y arreglar los errores, darle otra oportunidad. –

+0

Lo que sucede ahora es que cada vez que voy a una carpeta principal nueva, las anteriores se sobrescriben. – KdgDev

13

Una sencilla aplicación sin ningún tipo de control de errores:

function dirToArray($dir) { 
    $contents = array(); 
    # Foreach node in $dir 
    foreach (scandir($dir) as $node) { 
     # Skip link to current and parent folder 
     if ($node == '.') continue; 
     if ($node == '..') continue; 
     # Check if it's a node or a folder 
     if (is_dir($dir . DIRECTORY_SEPARATOR . $node)) { 
      # Add directory recursively, be sure to pass a valid path 
      # to the function, not just the folder's name 
      $contents[$node] = dirToArray($dir . DIRECTORY_SEPARATOR . $node); 
     } else { 
      # Add node, the keys will be updated automatically 
      $contents[] = $node; 
     } 
    } 
    # done 
    return $contents; 
} 
+0

Lo que ocurre aquí es que el listado del directorio se aplana y todos los archivos están listados uno al lado del otro. – KdgDev

+0

Acabo de ejecuté la parte de mi compilación de música, funciona como esperaba. – soulmerge

+0

Sé que esto es viejo, pero esto es * exactamente * lo que estaba buscando. Perfección. ¡Gracias! – Shelly

2

que he tenido éxito con el paquete de PEAR File_Find, específicamente the mapTreeMultiple() method. Su código sería algo así como:

require_once 'File/Find.php'; 
$fileList = File_Find::mapTreeMultiple($dirPath); 

Esto debería devolver una matriz similar a la que está solicitando.

+0

¿Qué es este archivo 'File/Find.php'? He escaneado mi disco duro y no tengo ese archivo. Tengo PEAR instalado. Podría ser que estoy usando Windows. – KdgDev

5

Según el código de @soulmerge's answer.Acabo de eliminar algunas liendres y comentarios y utilizar $startpath como mi directorio de inicio. (¡GRACIAS @soulmerge!)

function dirToArray($dir) { 
    $contents = array(); 
    foreach (scandir($dir) as $node) { 
     if ($node == '.' || $node == '..') continue; 
     if (is_dir($dir . '/' . $node)) { 
      $contents[$node] = dirToArray($dir . '/' . $node); 
     } else { 
      $contents[] = $node; 
     } 
    } 
    return $contents; 
} 

$r = dirToArray($startpath); 
print_r($r); 
+1

Funciona bien ... – VKGS

Cuestiones relacionadas