adambeazley Posted July 21, 2009 Share Posted July 21, 2009 so i have a function that returns a list of all of the files and directories, sub directories and sub directory files into an array, but I am having a little trouble formatting the output. Here is the arrays output using print_r: 0 -> AIA DOCS 1 -> AIA DOCS/IPD_Guide_2007.pdf 2 -> ENERGY 3 -> ENERGY/AEDG_K12.pdf 4 -> ENERGY/AEDG_SmallOfficeBuildings.pdf 5 -> MANAGEMENT 6 -> MANAGEMENT/Article_ Influence_ Connect...pdf The goal here is to have a list of all of our company resources, but instead of just a running list like you see above, I would like to have the list organized into expanding folders. so you would essentially see a list of sub directories and when you click on the sub directory, it expands and shows the files within. - AIA DOCS to + AIA DOCS --IPD_Guide_2007.pdf --file2.pdf --file3.pdf --etc.. So how can I take the single layer array and format it this way? Quote Link to comment Share on other sites More sharing options...
Psycho Posted July 21, 2009 Share Posted July 21, 2009 A better question is how to get your data into a better format to begin with. Instead of having allt he folders/files in a signle array and having to use string manipulation the data shoud be in a multidimensional array. Edit: I posted a function, but had to withdraw as I need to review it. Quote Link to comment Share on other sites More sharing options...
ignace Posted July 21, 2009 Share Posted July 21, 2009 You could list all files at once (and using javascript only display one branch at a time) or display upon request: Display upon request: $expand = $_POST['expand'];//don't forget to validate function create_tree($directory) { global $expand; $files = scandir($directory); print '<ul>'; foreach ($files as $file) { $basename = basename($file); if (is_dir($file)) { print "<li><a href=\"currentfile.php?expand=$file\"><img src=\"images/folder.png\" alt=\"folder\"> $basename</a></li>"; if ($file === $expand) { print '<li>' . create_tree($expand) . '</li>'; } } else { print "<li><a href=\"currentfile.php?expand=$file\"><img src=\"images/file.png\" alt=\"file\"> $basename</a></li>"; } } print '</ul>'; } create_tree(realpath('/path/to/expandable/directory')); This code is only intended to show you how you can faciliate this and is not intended for production use. A better aproach would be using the composite pattern. Edit: preferrably use mjdamato's solution, although I have one remark: why not create constants for the $to_return types? like DTA_RETURN_FILES? Quote Link to comment Share on other sites More sharing options...
adambeazley Posted July 27, 2009 Author Share Posted July 27, 2009 honestly I dont know how to populate a multidimensional array. i am using a code I found on the net to list the folders and have tried to make a multidimensional array, but its all new to me. My php experience is pretty basic, so just single layer arrays are new to me. Here is the code i am currently using: <?php function getDirectoryListing($dirname, $sortorder = "a", $show_subdirs = 1, $show_subdirfiles = 0, $exts = "all", $ext_save = 1) { // This function will return an array with filenames based on the criteria you can set in the variables // @sortorder : a for ascending (the standard) or d for descending (you can use the "r" for reverse as well, works the same) // @show_subdirs : 0 for NO, 1 for YES - meaning it will show the names of subdirectories if there are any // Logically subdirnames will not be checked for the required extentions // @show_subdirfiles : 0 for NO, 1 for YES - meaning it will show files from the subdirs // Files from subdirs will be prefixed with the subdir name and checked for the required extentions. // @exts can be either a string or an array, if not passed to the function, then the default will be a check for common image files // If exts is set to "all" then all extentions are allowed // @ext_save : 1 for YES, 0 for NO - meaning it will filter out system files or not (such as .htaccess) if (!$exts || empty($exts) || $exts == "") { $exts = array("jpg", "gif", "jpeg", "png", "doc", "xls", "pdf", "tif"); } if ($handle = opendir($dirname)) { $filelist = array(); while (false !== ($file = readdir($handle))) { // Filter out higher directory references if ($file != "." && $file != "..") { // Only look at directories or files, filter out symbolic links if ( filetype ($dirname."/".$file) != "link") { // If it's a file, check against valid extentions and add to the list if ( filetype ($dirname."/".$file) == "file" ) { if (checkFileExtention($file, $exts, $ext_save)) { $filelist[] = $file; } } // If it's a directory and either subdirs should be listed or files from subdirs add relevant names to the list else if ( filetype ($dirname."/".$file) == "dir" && ($show_subdirs == 1 || $show_subdirfiles == 1)) { if ($show_subdirs == 1) { $filelist[] = $file; } if ($show_subdirfiles == 1) { $subdirname = $file; $subdirfilelist = getDirectoryListing($dirname."/".$subdirname."/", $sortorder, $show_subdirs, $show_subdirfiles, $exts, $ext_save); for ($i = 0 ; $i < count($subdirfilelist) ; $i++) { $subdirfilelist[$i] = $subdirname."/".$subdirfilelist[$i]; } $filelist = array_merge($filelist, $subdirfilelist); } } } } } closedir($handle); // Sort the results if (count($filelist) > 1) { natcasesort($filelist); if ($sortorder == "d" || $sortorder == "r" ) { $filelist = array_reverse($filelist, TRUE); } } return $filelist; } else { return false; } } function checkFileExtention($filename, $exts, $ext_save = 1) { $passed = FALSE; if ($ext_save == 1) { if (preg_match("/^\./", $filename)) { return $passed; } } if ($exts == "all") { $passed = TRUE; return $passed; } if (is_string($exts)) { if (eregi("\.". $exts ."$", $filename)) { $passed = TRUE; return $passed; } } else if (is_array($exts)) { foreach ($exts as $theExt) { if (eregi("\.". $theExt ."$", $filename)) { $passed = TRUE; return $passed; } } } return $passed; } ?> Any ideas on how to edit this to make it a multidimensional array? Thanks Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.