2013-01-03 88 views
4

的所有子目录我有一个应该是简单的任务,循环在目录

  • 给定一个路径,搜索所有儿童(1级深)为less文件夹。
  • 如果文件夹中找到与css
  • 添加完整路径作为一个关键的阵列
  • 设定值的关键是相同的路径,但更换less里面少目录递归循环中的所有子目录
  • 以同样的方式添加子目录作为原始目录

因此,鉴于这种结构

注意:下面的所有项目,除了randomfile是目录

[email protected]:/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)); 
} 
+0

我不认为这是很大的错误,说实话,这是否合理快速? –

+0

是的,它似乎运行得足够快,我只是认为使用'RecursiveDirectoryIterator'可能会更好,但无法解决如何实际使用它们。 – Hailwood

回答

0

我认为代码被正确优化。
我做了一个脚本,列出所有的目录和子目录,然后删除那些没有“少”目录,并创建一个新的数组,为那些确实拥有它。
然后我测试了你和我的1000次循环。您的脚本平均使用了0.93s,我的脚本使用了1.27s。所以在我看来,你的代码没问题。

0

我不得不说,如果它的速度足够快并做好了工作,那么我会说没有必要进一步优化。如果你认为它速度不够快,或者没有完成这项工作,那么就修改它。无论如何,递归迭代器不太可能与您的实现有很大不同。

对不起,我忍不住了。