我有一个 FileSystemIterator ,我需要对其进行排序。
我在iterator_to_array(new FileSystemIterator($dir, FilesystemIterator::SKIP_DOTS))
上使用 uaSort 功能,具有以下排序功能:
function nameSort($a, $b) {
if($a->isDir() === $b->isDir()){
return strNatCaseCmp($a->getFilename(), $b->getFilename());
}
return $a->isDir() ? -1 : 1;
}
我在 $ dir 中有1063个文件和目录, nameSort 被调用11369次,生成的文件列表平均时间约为6秒。我想进一步测试项目是否是目录 uaSort 更多次调用 nameSort 但是这个假设是错误的,因为当我删除 isDir 号的行时通话时间增加到11957.然而,运行时间下降到0.6秒。
看起来调用 isDir 非常慢(它使列表慢10倍)。我怎样才能加快速度呢?
答案 0 :(得分:2)
如果调用isDir
的成本太高,并且每个路径调用它多次,则可能需要缓存某个目录是否为dir,并首先从缓存中检索它。这可以安全地调用isDir
方法。
答案 1 :(得分:1)
如果您只想获取单个目录的内容,可以使用glob。
$file = glob($path."/*", GLOB_MARK);
应该已经对进行了排序,并且可以通过拖尾来识别目录/所以你可以将array_filter指出来