RecursiveDirectoryIterator缩进子文件夹

时间:2015-07-17 07:22:09

标签: php file recursion directory indentation

我使用RecursiveDirectoryIterator列出了所有文件和文件夹,我希望以与浏览器相同的方式显示结果。 为此,我需要缩进子文件夹,但我不知道如何做到这一点...... 我可以使用子文件夹计数器,但它只适用于1级,2级它不起作用...

这是我的代码:

    $nb=1;
    $read_folder = './cases/';
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($read_folder), RecursiveIteratorIterator::SELF_FIRST);
    foreach ($iterator as $file) {
    $nb++;
    if ($file->isDir()) {
        $list_docs .= '<li class="docResult"><i class="fa fa-folder"></i>&nbsp;<span id="file_'.$nb.'">'.$file->getFilename().'</span></li>';   
    } else {
        $list_docs .= '<li class="docResult"><i class="fa fa-file-o"></i>&nbsp;<span id="file_'.$nb.'">'.$file->getFilename().'</span></li>';   
    }
}

2 个答案:

答案 0 :(得分:1)

这是遍历目录树的程序的第2版。

它必须是一个不同的程序,因为需要对输出进行排序,以便在文件之前打印目录。

现在,当我开始寻找答案时,它似乎很简单。嗯...; - /

我最终得出的结论是,我要么必须使用现成的包,例如synfony : The Finder Component,要么编写我自己的 <?php $arr = array('hello'=>array('world'=>array('in'=>'jo'))); $myString = "hello/world/inf"; function checkString($string, array $search_array) { $test = explode('/',$string); foreach($test as $key) { if(isset($search_array[$key])) $search_array = $search_array[$key]; else return false; } return true; } var_dump(checkString($myString,$arr)); die; 组件。

我已完成后者并自己制作$word = "This is one This is two This is three This is four"; $arr = explode (" " , $word); $lines = array_chunk($arr,3); foreach($lines as $line) echo implode (" ", $line)."<br>"; 课程。

输出没有以任何方式格式化。它使用浏览器的默认样式。

class SortedDirectory的源代码可用。

代码:

Directory iterator

SortedDirectory类:

如果要更改排序顺序,请编辑:

<?php // http://stackoverflow.com/questions/31470421/recursivedirectoryiterator-indent-subfolders include 'Q31470421-sorted-directory-class.php'; $sourceFolder = 'P:\developer\xampp\htdocs\testmysql\Q23408272'; // top level directory to search // $sourceFolder = 'P:\developer\xampp\htdocs\testmysql'; // top level directory to search /** * Sorted Directory for the supplied path */ $dirIter = new SortedDirectory(new SplFileInfo($sourceFolder)); /** * Process the complete path recursing around as required.. */ echo processDirectory($dirIter); exit; // end the program /** * Recurse around all the paths * * @param \SortedDirectory $directory */ function processDirectory(\SortedDirectory $directory, $depth = 0) { $html = showOneDirectory($directory, $depth); // show all files in this directory foreach ($directory as $entry) { if ($entry->isDir()) { // recurse arount any sub-directories $html .= '<ul class="dir-start">'; $html .= processDirectory(new \SortedDirectory($entry), $depth + 1); $html .= '<!-- dir-end --></ul>'; } } return $html; } /** * Process all the files for one directory * * @param \SortedDirectory $directory * @param type $depth * @return html */ function showOneDirectory(\SortedDirectory $directory, $depth = 0) { $dirCount = 0; $fileCount = 0; $list_docs = '<ul>'; foreach ($directory as $key => $entry) { if ($entry->isDir()) { $dirCount++; $list_docs .= '<li class="docResult">' .'<i class="fa fa-folder">' .'</i>&nbsp;<span id="file_'. $key .'">' .' Directory: ' .' Name: '. $entry->getFilename() .' | Path: '. $entry->getPath() .' | Depth: '. $depth .'</span></li>'; } else { $fileCount++; $list_docs .= '<li class="docResult">' .'<i class="fa fa-folder">' .'</i>&nbsp;<span id="file_'. $key .'">' .' File: ' .' Name: '. $entry->getFilename() .' | Path: '. $entry->getPath() .' | Depth: '. $depth .'</span></li>'; } } $list_docs .= '<li>'. "Counts: Dir: $dirCount, Files: $fileCount" .'</li>'; return $list_docs .= '</ul>'; }

SortedDirectory

答案 1 :(得分:1)

对于记录,我已经变成了一个要点(RecursiveDirectoryIterator),它可以读取包含其所有子节点的目录并输出JSON或只是一个数组。

https://gist.github.com/jonataswalker/3c0c6b26eabb2e36bc90

输出的树查看器

http://codebeautify.org/jsonviewer/067c13