PHP - creating a dynamic multidimensional file array

I want to create a file tree, and for this I need to convert an array of files and directories to a multidimensional array of file trees. For instance:

array ( 'file.txt', 'dir1/', 'dir1/dir2/', 'dir1/dir2/dir3/', 'dir1/file.txt', ) 

to

 array ( 'file.txt', 'dir1' => array ( 'dir2' => array ( 'dir3' => array(), ), 'file.txt', ) ) 

I tried to perform several functions but did not work. The problem I encountered, for example, is that there is no easy way to convert array ('test','test','test'),'test' to $array['test']['test']['test'] = 'test' .

+6
source share
3 answers

Here's a shorter recursive:

 function dir_tree($dir) { $files = array_map('basename', glob("$dir/*")); foreach($files as $file) { if(is_dir("$dir/$file")) { $return[$file] = dir_tree("$dir/$file"); } else { $return[] = $file; } } return $return; } 
+3
source

I have a PHP snippet for this:

 <?php function wps_glob($dir) { foreach (glob($dir . '/*') as $f) { if(is_dir($f)) { $r[] = array(basename($f) => wps_glob($f)); } else { $r[] = basename($f); } } return $r; } function wps_files($path) { $wpsdir = Array( 'root' => $path, 'struktur' => wps_glob($path) ); return $wpsdir; } ?> 

usage example here

+1
source

Check out my post here .

Answer: strtok will save you.

 <?php $input = [ '/RootFolder/Folder1/File1.doc', '/RootFolder/Folder1/SubFolder1/File1.txt', '/RootFolder/Folder1/SubFolder1/File2.txt', '/RootFolder/Folder2/SubFolder1/File2.txt', '/RootFolder/Folder2/SubFolder1/SubSubFolder1/File4.doc', ]; function parseInput($input) { $result = array(); foreach ($input AS $path) { $prev = &$result; $s = strtok($path, '/'); while (($next = strtok('/')) !== false) { if (!isset($prev[$s])) { $prev[$s] = array(); } $prev = &$prev[$s]; $s = $next; } $prev[] = $s; unset($prev); } return $result; } var_dump(parseInput($input)); 

Output:

 array(1) { ["RootFolder"]=> array(2) { ["Folder1"]=> array(2) { [0]=> string(9) "File1.doc" ["SubFolder1"]=> array(2) { [0]=> string(9) "File1.txt" [1]=> string(9) "File2.txt" } } ["Folder2"]=> array(1) { ["SubFolder1"]=> array(2) { [0]=> string(9) "File2.txt" ["SubSubFolder1"]=> array(1) { [0]=> string(9) "File4.doc" } } } } } 
+1
source

Source: https://habr.com/ru/post/956661/


All Articles