2012-01-18 56 views
0

我:PHP讀取目錄排序?

$directory='testdirectory/'; 
$handler = opendir($directory); 
while ($file = readdir($handler)) { 
... 
} 

什麼是執行opendir/readdir的像這樣的輸出排序?是日期,字母還是別的,因爲我無法從輸出中看出來。

+0

請注意,如果沒有更多文件,'readdir'返回布爾值false,但它也可以返回評估爲布爾值false的值。你應該使用'while(false!==($ file = readdir($ handle))){'確保你會讀取所有的名字。 – Arjan 2012-01-18 22:15:15

+0

你好,什麼事情會使它返回一些評估布爾值爲false的東西? – David19801 2012-01-18 22:16:43

+1

@ David19801如果有一個名爲'0'的文件,如果評估結果爲false。在這個特定的例子中,我認爲沒有其他合法的情況會導致模棱兩可的錯誤。 – DaveRandom 2012-01-18 22:22:51

回答

4

http://php.net/readdir說:「條目按文件系統存儲的順序返回。」

+0

我明白了......但那是什麼意思?我有apache ... – David19801 2012-01-18 22:06:09

+1

這取決於你的操作系統。如果你想確保你可以用asort或類似的方法對它們進行分類。 – powerbuoy 2012-01-18 22:07:36

+0

其中大部分是'創造秩序'。 – 2012-01-18 22:07:52

2

如前所述,很難控制readdir()列出文件的順序。這個函數可以幫助你 - 它通過一個目錄的路徑,在關聯數組中創建它們的列表,並根據名稱,大小或訪問/修改/創建時間對它們進行排序。希望它的使用應該相當自我解釋。

// Constants to make usage more reader-friendly 
define('DIR_SORT_NAME', 1); 
define('DIR_SORT_SIZE', 2); 
define('DIR_SORT_ATIME', 3); 
define('DIR_SORT_MTIME', 4); 
define('DIR_SORT_CTIME', 5); 

function readdir_sorted_array ($dir, $sortCol = DIR_SORT_NAME, $sortDir = SORT_ASC) { 

    // Validate arguments 
    $dir = rtrim(str_replace('\\', '/', $dir), '/'); 
    $sortCol = (int) ($sortCol >= 1 && $sortCol <= 5) ? $sortCol : 1; 
    $sortDir = ($sortDir == SORT_ASC) ? SORT_ASC : SORT_DESC; 
    $name = $size = $aTime = $mTime = $cTime = $table = array(); 

    // Open the directory, return FALSE if we can't 
    if (!is_dir($dir) || (!$dp = opendir($dir))) return FALSE; 

    // Fetch a list of files in the directory and get stats 
    for ($i = 0; ($file = readdir($dp)) !== FALSE; $i++) { 
    if (!in_array($file, array('.','..'))) { 
     $path = "$dir/$file"; 
     $row = array('name'=>$file,'size'=>filesize($path),'atime'=>fileatime($path),'mtime'=>filemtime($path),'ctime'=>filectime($path)); 
     $name[$i] = $row['name']; 
     $size[$i] = $row['size']; 
     $aTime[$i] = $row['atime']; 
     $mTime[$i] = $row['mtime']; 
     $cTime[$i] = $row['ctime']; 
     $table[$i] = $row; 
    } 
    } 

    // Sort the results 
    switch ($sortCol) { 
    case DIR_SORT_NAME: 
     array_multisort($name, $sortDir, $table); 
     break; 
    case DIR_SORT_SIZE: 
     array_multisort($size, $sortDir, $name, SORT_ASC, $table); 
     break; 
    case DIR_SORT_ATIME: 
     array_multisort($aTime, $sortDir, $name, SORT_ASC, $table); 
     break; 
    case DIR_SORT_MTIME: 
     array_multisort($mTime, $sortDir, $name, SORT_ASC, $table); 
     break; 
    case DIR_SORT_CTIME: 
     array_multisort($cTime, $sortDir, $name, SORT_ASC, $table); 
     break; 
    } 

    // Return the result 
    return $table; 

}