我有一个应该很简单的任务,
- 给定路径,搜索
less
文件夹的所有子目录(1级深)。 - 如果找到文件夹,将完整路径作为键添加到数组
- 将密钥的值设置为相同的路径,但将
less
替换为css
- 在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'目录的目录,并为那些有'less'目录的目录创建一个新的数组。
然后我用1000次循环测试了你的和我的。你的脚本平均耗时0.93秒,我的脚本耗时1.27秒。所以在我看来,你的代码是好的
我不得不说,如果它足够快,做的工作,然后我说没有必要进一步优化。如果你达到了一个点,它不够快或不能完成工作,然后重新审视它。无论如何,递归迭代器不会对你的实现产生太大的影响。
对不起,我帮不了你。