[英]PHP: usort files / speed
我正在尋找一種基於兩個因素對對象數組進行排序的方法。 這是我當前的usort實現:
usort($contents, function($a, $b) {
$aN = $a->getName();
$bN = $b->getName();
$aD = $a->isDirectory();
$bD = $b->isDirectory();
switch(true) {
case $aD && !$bD: return -1;
case !$aD && $bD: return +1;
default:
return strcmp($aN, $bN); // Edited
}
});
您可能已經猜到了,這些對象代表文件,但是對於此示例,僅->getName
和->isDirectory
方法是相關的。
我創建的這個示例確實有效,但是我在9000個文件的集合上進行了測試,僅此代碼塊就將常規過程的時間從1秒增加到了大約3。
它所做的排序非常簡單:
我正在尋找一種方法來改進它,或找到替代方法。
如果對任何人都感興趣,這就是$contents
數組的來源:
$path = $this->compute($path);
$dir = opendir($path);
$contents = array();
while(false !== $name = readdir($dir)) {
if($name == '.' || $name == '..') {
continue;
}
$contents[] = new LocalFile($this->directory, sprintf('%s/%s', $path, $name));
}
return $contents;
但是,此過程只需要很少的時間,我很想發現排序可以在讀取目錄期間完成。
旁注,我已經閱讀到可以通過擴展DirectoryIterator
並進行比較來使用DirectoryIterator
,但是我不確定這與我現在正在做的有很大不同。
您的排序邏輯可以簡化為:
if (($a_isdir = $a->isDirectory()) != $b->isDirectory()) {
// either a is directory and b is not, or the other way around
return $a_isdir ? -1 : 1;
}
// a and b are either both directories or files
// compare normally
return strcmp($a->getName(), $b->getName());
另外,如Mark所提到的,您可以通過在::compare($a, $b)
實現上述邏輯來擴展SplHeap
,並在插入對象時對對象列表進行排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.