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

Я пытаюсь получить многомерный массив для каталогов, отформатированных следующим образом:

[ { "text": "another_folder", "href": "gui\/default\/uploads\/another_folder", "depth": 0 }, { "text": "subfold", "href": "gui\/default\/uploads\/subfold", "depth": 0, "nodes": { "text": "sub-subfold", "href": "gui\/default\/uploads\/subfold\/sub-subfold", "depth": 1, } } ] 

Я хочу использовать RecursiveIterators. Что я сделал до сих пор, я получаю все каталоги, перечисленные в указанном пути. Мне нужно зайти к детям, где я собрал вещи.

 public function list_folders($folder_path='') { if(!$folder_path) $folder_path = $this->upl_path; $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($folder_path), RecursiveIteratorIterator::SELF_FIRST); $iterator->setFlags(RecursiveDirectoryIterator::SKIP_DOTS); $r = array(); $counter = 0 foreach ($iterator as $splFileInfo) { if($splFileInfo->isDir()) { $r[$counter] = array( 'text' => $splFileInfo->getFilename(), 'href' => str_replace('\\','/',$splFileInfo->getPathname()) ); if(How to check if it has children) { $result[$counter] += array('nodes'=> CALL RECURSIVE HERE ? ); } $counter++; } echo json_encode($r,JSON_PRETTY_PRINT); } 

Я буду использовать любую идею или помочь с радостью.

Solutions Collecting From Web of "Многомерный список каталогов с рекурсивным итератором"

Ваш код был почти функциональным, но ему не хватало нескольких ключевых моментов. Я адаптировал ваш код так, чтобы он работал, и добавил некоторые комментарии, которые, я надеюсь, помогут вам понять, что вам не хватает:

 class FolderListing { public function list_folders($folder_path = '', $depth = 0) { if (!$folder_path) $folder_path = $this->upl_path; $iterator = new IteratorIterator(new DirectoryIterator($folder_path)); $r = array(); foreach ($iterator as $splFileInfo) { if ($splFileInfo->isDot()) { continue; } // we need to do this for both folders and files $info = array( 'text' => $splFileInfo->getFilename(), 'href' => str_replace('\\', '/', $splFileInfo->getPathname()), 'depth' => $depth ); // is we have a directory, try and get its children if ($splFileInfo->isDir()) { // !!! I recommend to do an echo $splFileInfo->getPathname() here // to see the order in which recursion works !!! $nodes = $this->list_folders($splFileInfo->getPathname(), $depth + 1); // only add the nodes if we have some if (!empty($nodes)) { $info['nodes'] = $nodes; } } // add the info to the array. No need for a counter :) $r[] = $info; } // the return is important to be able to build the multi dimensional array return $r; } } $test = new FolderListing(); $ret = $test->list_folders('./test'); // change this to whatever you want var_dump($ret); 

Удачи!