Рекурсивный массив структуры каталогов в PHP

Я пытаюсь поместить некоторые папки на моем жестком диске в массив.

Например, фотографии каникул. Допустим, у нас есть эта структура:

  • Набор 1
    • Пункт 1 набора 1
    • Пункт 2 набора 1
    • Пункт … набора 1
  • Набор 2
    • Подмножество 1 набора 2
      • Пункт 1 подмножества 1 набора 2
      • Пункт … подмножества 1 набора 2
    • Подмножество 2 набора 2
    • Случайный файл, а не каталог.
  • Набор 3

Я хочу иметь что-то подобное, как массив.
Значение У меня есть 1 большой массив, и в этом массиве больше массивов. Каждый набор и подмножество получает свой собственный массив.

Я пытаюсь сделать это примерно так:

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

Я наткнулся на это: http://www.the-art-of-web.com/php/dirlist/

Но это не то, что я ищу. Я вмешивался в это, но это ничего не давало мне неприятностей.

Вот пример, источник просмотра для большего разрешения (без щелчка, по-видимому …). пример

Related of "Рекурсивный массив структуры каталогов в PHP"

Я рекомендую использовать DirectoryIterator для создания массива

Вот фрагмент, который я собрал очень быстро, но в настоящее время у меня нет среды для его тестирования, поэтому будьте готовы его отладить.

 $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; } 

Простая реализация без обработки ошибок:

 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; } 

На основе кода ответа @ soulmerge . Я просто удалил несколько нит и комментариев и использовал $startpath качестве моего стартового каталога. (СПАСИБО ВАС @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); 

У меня был успех с пакетом PEAR File_Find, в частности с методом mapTreeMultiple () . Ваш код станет чем-то вроде:

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

Это должно возвращать массив, похожий на то, о чем вы просите.