我使用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> <span id="file_'.$nb.'">'.$file->getFilename().'</span></li>';
} else {
$list_docs .= '<li class="docResult"><i class="fa fa-file-o"></i> <span id="file_'.$nb.'">'.$file->getFilename().'</span></li>';
}
}
答案 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> <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> <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
输出的树查看器