2009-06-04 7 views
17

J'essaie de placer des dossiers sur mon disque dur dans un tableau.Tableau récursif profond de la structure de répertoires dans PHP

Par exemple, des photos de vacances. Disons que nous avons cette structure:

  • Set 1
    • Point 1 de Set 1
    • Point 2 de Set 1
    • article ... de Set 1
  • Ensemble 2
    • Sous-ensemble 1 du groupe 2
      • Point 1 de 1 Set Sous-ensemble 2
      • article ... de 1 Set Subset 2
    • 2 Set Subset 2
    • fichier aléatoire, pas dir.
  • Set 3
  • ...

Je veux avoir quelque chose comme ça, comme un tableau. Signification J'ai 1 grand tableau et dans ce tableau sont plus de tableaux. Chaque ensemble et sous-ensemble possède son propre tableau.

Je suis en train de le faire ressembler à quelque chose comme ceci:

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

je suis tombé sur ceci: http://www.the-art-of-web.com/php/dirlist/

Mais ce n'est pas ce que je cherche. Je me suis mêlé de ça mais ça ne me donne que des ennuis.

Voici un exemple, source d'affichage pour une résolution plus grande (pas de clic apparemment ...). Example

+0

Cette question n'est pas un double et n'aurait pas dû être marquée comme telle. – Dom

Répondre

40

Je recommande d'utiliser DirectoryIterator pour construire votre tableau

Voici un extrait que je lançai ensemble très rapide, mais je n'ai pas un environnement pour le tester en ce moment alors soyez prêt à déboguer.

$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

Je reçois cette erreur: Erreur fatale: Le niveau maximum d'imbrication de la fonction '100' est atteint, avortant! Et je ne vois pas pourquoi je devrais obtenir ceci ... la plus haute imbrication que j'ai est de 5 niveaux. – KdgDev

+1

Ok, j'ai eu l'occasion de lancer ceci et de corriger les bugs - donnez-moi un autre coup de feu. –

+0

Ce qui se passe maintenant, c'est que chaque fois que je vais dans un nouveau dossier principal, les anciens sont écrasés. – KdgDev

13

Une mise en œuvre simple, sans aucune manipulation d'erreur:

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

Ce qui se passe ici, c'est que la liste de répertoires est aplatie et tous les fichiers sont listés les uns après les autres – KdgDev

+0

a fonctionné sur une partie de ma compilation de musique, fonctionne comme prévu – soulmerge

+0

Je sais que c'est vieux, mais c'est * exactement * ce que je cherchais Perfection.Merci! – Shelly

2

J'ai eu du succès avec le paquet PEAR File_Find, en particulier the mapTreeMultiple() method. Votre code deviendrait quelque chose comme:

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

Cela devrait retourner un tableau similaire à ce que vous demandez.

+0

Qu'est-ce que ce fichier 'Fichier/Find.php'? J'ai scanné mon disque dur et je n'ai pas de fichier dessus. J'ai PEAR installé. Peut-être que j'utilise Windows. – KdgDev

5

Basé sur le code de @soulmerge's answer.Je viens de supprimer quelques lentes et les commentaires et d'utiliser $startpath comme mon répertoire de départ. (MERCI @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

Ça marche bien ... – VKGS

Questions connexes