2012-10-03 40 views
0

我想出了一個基本的文件導航器,它接受用戶輸入以跳轉到不同的目錄。我與它唯一的問題是,我基本上遍歷數據三次:優化文件導航器

  1. 獲取所有目錄的有效列表與用戶輸入比較
  2. 建立目錄的「分類」列表文件
  3. 輸出最終名單

優化或改善這些代碼的任何提示?

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 />"; 
     } 
    } 
} 
+0

您確定要使用'ParentIterator'嗎?這將僅顯示具有子目錄/文件的目錄,並假定您不想向用戶顯示空目錄。這很可能是這種情況,但是如果他們想要導航到一個空目錄並創建一個新文件等等呢? – Timothy

回答

0

目錄結構多久改變一次?它是否可以緩存,只有在每次請求發生更改時才重新生成白名單?這將取決於需求和負載因素。除此之外,這可能是微優化的領域。