簡體   English   中英

循環遍歷目錄的所有子目錄

[英]Looping over all subdirectories of a directory

我的任務應該很簡單,

  • 給定一個路徑,搜索所有子項(1級深)以獲取less文件夾。
  • 如果找到該文件夾​​,請將完整路徑添加為數組的鍵
  • 將鍵的值設置為相同的路徑,但用css替換為less
  • 在less目錄內遞歸循環所有子目錄
  • 以與原始目錄相同的方式添加子目錄

所以,鑒於這種結構

注意:除randomfile之外的所有項目都是目錄

matthew@vaio:/var/www/constructor/public/bundles$ tree
.
├── first
│   └── less
│       ├── secondtester
│       └── tester
│           ├── anothersubtester
│           ├── randomfile
│           └── subtester
├── second
│   └── less
│       ├── secondtester
│       └── tester
│           ├── anothersubtester
│           ├── randomfile
│           └── subtester
└── third
    └── noless
        ├── secondtester
        └── tester
            ├── anothersubtester
            ├── randomfile
            └── subtester

18 directories, 3 files

我想最終得到這個數組(注意我已經截斷了這里的路徑只是為了讓它更容易閱讀)

Array
    (
    [/b/second/less] => /b/second/css
    [/b/second/less/secondtester] => /b/second/css/secondtester
    [/b/second/less/tester] => /b/second/css/tester
    [/b/second/less/tester/subtester] => /b/second/css/tester/subtester
    [/b/second/less/tester/anothersubtester] => /b/second/css/tester/anothersubtester
    [/b/first/less] => /b/first/css
    [/b/first/less/secondtester] => /b/first/css/secondtester
    [/b/first/less/tester] => /b/first/css/tester
    [/b/first/less/tester/subtester] => /b/first/css/tester/subtester
    [/b/first/less/tester/anothersubtester] => /b/first/css/tester/anothersubtester
)

現在我有下面的代碼,但我認為這根本沒有優化,例如我知道有RecursiveIteratorIterators等,但我無法弄清楚如何將它們用於此任務,因此不得不求助於遞歸函數提升。 基本上,我想知道如何寫這個以更好地進行優化:

$directories = array();
$bundlePath = realpath('/public/bundles');

function lessSearcher($lessPath, $cssPath){
    $directories = array($lessPath => $cssPath);

    $lessDirs = new DirectoryIterator($lessPath);
    foreach ($lessDirs as $lessDir) {
        //we only want the directories and not the .'s
        if ($lessDir->isDot() || !$lessDir->isDir()) continue;
        $lessCurrent = $lessPath . '/' . $lessDir->getFileName();
        $cssCurrent = $cssPath . '/' . $lessDir->getFileName();
        $directories[$lessCurrent] = $cssCurrent;
        $directories = array_merge($directories, lessSearcher($lessCurrent, $cssCurrent));
    }

    return $directories;
}

$bundles = new DirectoryIterator($bundlePath);
foreach ($bundles as $bundle) {
    //we only want the directories and not the .'s
    if($bundle->isDot() || !$bundle->isDir()) continue;
    //we only want the directories that have a less directory
    if(!realpath($bundlePath.'/'.$bundle->getFileName().'/less')) continue;

    $lessPath = realpath($bundlePath . '/' . $bundle->getFileName()) . '/less';
    $cssPath = realpath($bundlePath . '/' . $bundle->getFileName()) . '/css';

    $directories = array_merge($directories, lessSearcher($lessPath, $cssPath));
}

我認為代碼已正確優化。
我創建了一個列出所有目錄和子目錄的腳本,然后刪除那些沒有'less'目錄的腳本,並為擁有它的那些創建一個新數組。
然后我用1000次循環測試你和我的。 你的腳本平均花了0.93秒 ,我的腳本花了1.27秒 所以在我看來,你的代碼還可以。

我不得不說,如果它足夠快並完成工作,那么我會說沒有必要進一步優化。 如果你達到一個不夠快或不能完成工作的點,那么就將其復活。 無論如何,遞歸迭代器不太可能與您的實現有很大不同。

對不起,我忍不住多了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM