2011-10-04 106 views
15

我使用php的DirectoryIterator類來列出目錄中的文件。然而,我不能想出一個按日期排序文件的簡單方法。這是如何與DirectoryIteratorphp DirectoryIterator按日期排序文件

<?php 
$dir = new DirectoryIterator('.'); 
    foreach ($dir as $fileinfo) {  
    echo $fileinfo->getFilename() . '<br>'; 
    } 
?> 

如果我的名字我的文件,如whatever_2342345345.ext其中數字表示毫秒時間,所以每個文件都有一個唯一的編號來完成。我們如何通過查看下劃線後的數字來排序

回答

20

如果您需要排序,請構建一個數組並對其進行排序。

$files = array(); 
$dir = new DirectoryIterator('.'); 
foreach ($dir as $fileinfo) {  
    $files[$fileinfo->getMTime()][] = $fileinfo->getFilename(); 
} 

ksort($files); 

這將構建一個數組,其修改時間作爲鍵和一個文件名數組作爲值。然後它通過ksort()進行排序,它會按照修改時間的順序爲您提供文件名。

然後,如果您想將結構重新拼合到一個標準的陣列,可以使用...

$files = call_user_func_array('array_merge', $files); 
+10

我不得不說,你說錯了「一個迭代器存在這樣做,迭代。」。迭代器本質上可以增加篩選和排序功能。事實上,迭代器的目標是提供迭代接口,但是這個定義並不限制迭代器對數據做一些內部工作。 – zerkms

+0

你提供的例子不適合我。你試過了嗎?如果我將我的文件命名爲whatever_2342345345.ext,其中數字表示每個文件具有唯一編號的時間。我們如何通過查看下面的數字來排序 – Pinkie

+0

@Pinkie:我沒有嘗試,但理論應該是正確的。你得到了什麼錯誤?你在看''文件'? – alex

1

如果多個文件具有相同的修改的時間(更新):

$files = array(); 
$mtimes = array(); 
$dir = new DirectoryIterator('.'); 
foreach($dir as $file){ 
    if(!$file->isFile()) 
    continue; 

    $mtime = $file->getMTime(); 

    if(!$mtimes[$mtime]){ 
    $files[$mtime.'.0'] = $file->getFilename(); 
    $mtimes[$mtime] = 1; 
    }else{ 
    $files[$mtime.'.'.$mtimes[$mtime]++] = $file->getFilename(); 
    } 
} 

ksort($files); 
1

如果您仍想訪問DirectoryIterator(例如isDot()getSize()等)的所有可用數據,可能的方法是將迭代器鍵存儲在要排序的陣列上,並在稍後查找DirectoryIterator

$sorted_keys = array(); 
$dir_iterator = new DirectoryIterator('.'); 

foreach ($dir_iterator as $fileinfo) 
{ 
    $sorted_keys[$fileinfo->getMTime()] = $fileinfo->key(); 
} 

ksort($sorted_keys); 

/* Iterate `DirectoryIterator` as a sorted array */ 
foreach ($sorted_keys as $key) 
{ 
    $dir_iterator->seek($key); 
    $fileinfo = $dir_iterator->current(); 

    /* Use $fileinfo here as a normal DirectoryIterator */ 
    echo $fileinfo->getFilename() . ' ' . $fileinfo->getSize() . '<br>'; 
}