簡體   English   中英

PHP:usort文件/速度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM