Deep recursive array of directory structure in PHP
I recommend using DirectoryIterator to build your array
Here's a snippet I threw together real quick, but I don't have an environment to test it in currently so be prepared to debug it.
$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;}
A simple implementation without any error handling:
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;}
Based on the code of @soulmerge's answer. I just removed some nits and the comments and use $startpath
as my starting directory. (THANK YOU @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);