Я пытаюсь поместить некоторые папки на моем жестком диске в массив.
Например, фотографии каникул. Допустим, у нас есть эта структура:
Я хочу иметь что-то подобное, как массив.
Значение У меня есть 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/
Но это не то, что я ищу. Я вмешивался в это, но это ничего не давало мне неприятностей.
Вот пример, источник просмотра для большего разрешения (без щелчка, по-видимому …).
Я рекомендую использовать 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);
Это должно возвращать массив, похожий на то, о чем вы просите.