2011-03-27 118 views

回答

35

是的,你必須通讀全部。但由於目錄訪問被緩存,所以你不應該爲此擔心。

$files = array_merge(glob("img/*.png"), glob("img/*.jpg")); 
$files = array_combine($files, array_map("filemtime", $files)); 
arsort($files); 

$latest_file = key($files); 
+3

不是,它只是一個帶有內建文件名過濾器的scandir()(我寫了一次PHP4重新實現),真正的問題在於使用兩個globs,使用'glob(「img/*。{png ,jpg,gif}「,GLOB_BRACE)'在你的情況下。 – mario 2011-03-27 10:12:16

+1

true,scandir返回所有*條目,但glob將其濾掉 已經。 readdir方法的不同之處在於,您可以通過更多的php/system調用以停下來的方式進行操作。 – mario 2011-03-27 10:59:26

+0

glob在編譯的C代碼中循環,而readdir在循環中需要較慢的PHP。 – mario 2011-03-27 11:18:48

4

我不記得有沒有看到一個功能,可以做你要求的。

所以,我認爲你將不得不通過所有(至少jpg/png/gif)文件,並搜索每個文件的最後修改日期。


這裏有一個可能的解決方案的基礎上,DirectoryIterator類SPL的:

$path = null; 
$timestamp = null; 

$dirname = dirname(__FILE__); 
$dir = new DirectoryIterator($dirname); 
foreach ($dir as $fileinfo) { 
    if (!$fileinfo->isDot()) { 
     if ($fileinfo->getMTime() > $timestamp) { 
      // current file has been modified more recently 
      // than any other file we've checked until now 
      $path = $fileinfo->getFilename(); 
      $timestamp = $fileinfo->getMTime(); 
     } 
    } 
} 

var_dump($path); 


當然,你也可以做同樣的事情與readdir()等相應的功能。

+0

PHP應該有內置這樣的功能,所以我們並不需要分析所有目錄.. IMO – dynamic 2011-03-27 10:10:09

+0

寫這個功能並不難;-) ;;;你需要看起來有點特殊,所以核心開發人員不希望在PHP本身中實現這樣的功能是可以理解的。 – 2011-03-27 10:20:22

+0

即使你沒有檢查exstension大聲笑我會接受這個,因爲我相信readdir(或這個等效)比glob +另一個解析更快 – dynamic 2011-03-27 11:32:02

0
function listdirfile_by_date($path) 
{ 
    $dir = opendir($path); 
    $list = array(); 
    while($file = readdir($dir)) 
    { 
     if($file != '..' && $file != '.') 
     { 
      $mtime = filemtime($path . $file) . ',' . $file; 
      $list[$mtime] = $file; 
     } 
    } 
    closedir($dir); 
    krsort($list); 

    foreach($list as $key => $value) 
    { 
     return $list[$key]; 
    } 
    return ''; 
} 
相關問題