2009-06-04 5 views
17

Sto provando a mettere alcune cartelle sul mio disco fisso in un array.Array ricorsivo profondo della struttura di directory in PHP

Per esempio, foto di vacanza. Diciamo che abbiamo questa struttura:

  • Set 1
    • Articolo 1 di Set 1
    • punto 2 Set 1
    • Articolo ... di Set 1
  • Set 2
    • sottoinsieme 1 del set 2
      • Articolo 1 di sottogruppo 1 di Set 2
      • Articolo ... di sottogruppo 1 di Set 2
    • sottoinsieme di 2 Set 2
    • file casuale, non un dir.
  • Set 3
  • ...

voglio avere qualcosa di simile, come un array.
Significato Ho 1 grande array e in quell'array ci sono più array. Ogni set e sottoinsieme ottiene il proprio array.

Sto cercando di far sembrare qualcosa di simile:

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(...) 
    ... 
) 

mi sono imbattuto in questo: http://www.the-art-of-web.com/php/dirlist/

Ma non è quello che sto cercando. Me ne sono immischiato, ma non mi dà altro che problemi.

Ecco un esempio, visualizzare l'origine per una risoluzione maggiore (nessun clic apparentemente ...). Example

+0

Questa domanda non è una replica e non dovrebbe essere stata contrassegnata come tale. – Dom

risposta

40

mi consiglia di utilizzare DirectoryIterator per costruire l'array

Ecco un frammento ho buttato insieme rapido reale, ma non hanno un ambiente per testare in modo da essere pronti al momento di eseguire il debug di esso.

$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

Ho ricevuto questo errore: Errore irreversibile: raggiunto il massimo livello di nidificazione delle funzioni di "100", interruzione! E non vedo perché dovrei ottenere questo ... nidificazione più alta che ho sono 5 livelli. – KdgDev

+1

Ok, ho avuto la possibilità di eseguire questo e corretto i bug - dargli un'altra possibilità. –

+0

Quello che succede ora è che ogni volta che vado in una nuova cartella principale, i vecchi vengono sovrascritti. – KdgDev

13

Una semplice implementazione, senza alcuna gestione degli errori:

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

Quello che succede qui è che l'elenco delle directory è appiattito e tutti i file sono elencati uno dopo l'altro. – KdgDev

+0

I just Ho eseguito la parte della mia raccolta musicale, funziona come previsto – soulmerge

+0

So che questo è vecchio, ma questo è esattamente * quello che stavo cercando.Perfezione.Grazie, – Shelly

2

Ho avuto successo con il pacchetto PEAR File_Find, specificamente the mapTreeMultiple() method. Il tuo codice diventerebbe qualcosa del tipo:

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

Questo dovrebbe restituire un array simile a quello che stai chiedendo.

+0

Cos'è questo file 'File/Trova.php'? Ho scansionato il mio hard disk e non ho questo file su di esso. Ho installato PEAR. Potrebbe essere che sto usando Windows. – KdgDev

5

Sulla base del codice @soulmerge's answer.Ho appena rimosso alcune lendini e i commenti e uso $startpath come directory iniziale. (GRAZIE @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

Funziona bene ... – VKGS