0
我想出了一個基本的文件導航器,它接受用戶輸入以跳轉到不同的目錄。我與它唯一的問題是,我基本上遍歷數據三次:優化文件導航器
- 獲取所有目錄的有效列表與用戶輸入比較
- 建立目錄的「分類」列表文件
- 輸出最終名單
優化或改善這些代碼的任何提示?
define('ROOT', '/path/to/somewhere');
// get a list of valid paths
$valid = array();
$dir = new RecursiveDirectoryIterator(ROOT);
$dir->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
$iter = new ParentIterator($dir);
foreach(new RecursiveIteratorIterator($iter, RecursiveIteratorIterator::SELF_FIRST) as $file) {
$path = str_replace(ROOT, '', $file->getPathname());
$valid[] = $path;
}
// user input
$subpath = isset($_GET['path']) && in_array($_GET['path'], $valid) ? $_GET['path'] : NULL;
$cwd = isset($subpath) ? ROOT.$subpath : ROOT;
// build and sort directory tree
$files = array();
foreach(new DirectoryIterator($cwd) as $file) {
if($file->isDot()) {
continue;
}
if($file->isDir()) {
$path = str_replace(ROOT, '', $file->getPathname());
$count = iterator_count(new RecursiveDirectoryIterator($file->getRealPath(), FilesystemIterator::SKIP_DOTS));
$files[$path]['name'] = $file->getFilename();
$files[$path]['count'] = $count;
} else {
$files[] = $file->getFilename();
}
asort($files);
}
// output directory tree
if(!empty($files)) {
foreach($files as $key=>$value) {
if(is_array($value)) {
echo "<a href=\"?path=$key\">{$value['name']} ({$value['count']})</a><br />";
} else {
echo "$value<br />";
}
}
}
您確定要使用'ParentIterator'嗎?這將僅顯示具有子目錄/文件的目錄,並假定您不想向用戶顯示空目錄。這很可能是這種情況,但是如果他們想要導航到一個空目錄並創建一個新文件等等呢? – Timothy