2009-06-04 5 views
17

Ich versuche, einige Ordner auf meiner Festplatte in ein Array zu setzen.Tiefe rekursive Array der Verzeichnisstruktur in PHP

Zum Beispiel, Urlaubsbilder. Lassen Sie uns sagen, dass wir diese Struktur haben:

  • Set 1
    • Artikel 1 von Set 1
    • Artikel 2 von Set 1
    • Artikel ... von Set 1
  • Satz 2
    • Teilsatz 1 von Satz 2
      • Artikel 1 von Subset 1 von Set 2
      • Artikel ... von Subset 1 Satz 2
    • Subset 2 von Set 2
    • Zufall Datei, kein Verzeichnis.
  • Set 3
  • ...

Ich möchte so etwas haben, als ein Array.
Bedeutung Ich habe 1 großes Array und in diesem Array sind mehr Arrays. Jede Menge und Teilmenge erhält ein eigenes Array.

Ich versuche es so etwas wie dies aussehen:

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

ich über das kam: http://www.the-art-of-web.com/php/dirlist/

Aber das ist nicht das, was ich suche. Ich habe mich damit beschäftigt, aber es gibt mir nur Ärger.

Hier ist ein Beispiel, Quelle für größere Auflösung anzeigen (kein Klicken scheinbar ...). Example

+0

Diese Frage ist kein Duplikat und sollte nicht als solche gekennzeichnet sein. – Dom

Antwort

40

I DirectoryIterator empfehlen Ihr Array

Hier zu bauen ist ein Ausschnitt ich zusammen ganz schnell warf, aber ich habe nicht eine Umgebung, um es zu testen in derzeit so vorbereitet werden, es zu debuggen.

$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

Ich erhalte diesen Fehler: Schwerwiegender Fehler: Maximale Funktionsverschachtelung von '100' erreicht, Abbruch! Und ich sehe nicht, warum ich das bekommen sollte ... höchste Verschachtelung, die ich habe, ist 5 Ebenen. – KdgDev

+1

Ok, ich habe eine Chance, das auszuführen und die Fehler zu beheben - gib es noch einmal. –

+0

Was passiert jetzt, wenn ich in einen neuen primären Ordner gehe, werden die alten überschrieben. – KdgDev

13

Eine einfache Implementierung ohne Fehlerbehandlung:

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

Was passiert hier ist, dass die Verzeichnisliste abgeflacht ist und alle Dateien direkt hintereinander aufgelistet sind. – KdgDev

+0

Ich gerade Ich habe den alten Teil meiner Musikkompilation, funktioniert wie erwartet. – soulmerge

+0

Ich weiß, das ist alt, aber das ist genau das, was ich gesucht habe. Perfektion. Danke! – Shelly

2

ich Erfolg mit dem PEAR File_Find Paket, the mapTreeMultiple() method speziell hatte. Ihr Code würde so aussehen:

Dies sollte ein Array ähnlich dem, was Sie fordern zurückgeben.

+0

Was ist das 'File/Find.php' Datei? Ich habe meine Festplatte gescannt und ich habe keine solche Datei darauf. Ich habe PEAR installiert. Könnte sein, dass ich Windows benutze. – KdgDev

5

Basiert auf dem Code @soulmerge's answer.Ich habe nur ein paar Nissen und die Kommentare entfernt und verwende $startpath als mein Startverzeichnis. (DANKE @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

Es funktioniert gut ... – VKGS