繁体   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