2011-03-27 23 views

Respuesta

35

Sí, tiene que leerlos todos. Pero dado que los accesos al directorio están en la memoria caché, no deberías preocuparte por eso.

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

$latest_file = key($files); 
+3

No. Es solo un scandir() con un filtro de nombre de archivo incorporado. (Escribí una reimplementación de PHP4 una vez). El problema real aquí es usar dos globs. Es más rápido usar 'glob (" img/*. {png , jpg, gif} ", GLOB_BRACE)' en su caso. – mario

+1

Es cierto, scandir devuelve * todas las entradas. Pero glob lo filtra ya La diferencia en el enfoque readdir es que lo haces de forma intermitente con más llamadas php/sistema. – mario

+0

glob realiza el bucle en el código C compilado, mientras que readdir requiere un bucle PHP while más lento. – mario

4

No recuerdo haber visto alguna vez una función que hiciera lo que usted pregunta.

Por lo tanto, creo que tendrá que revisar todos los archivos (al menos jpg/png/gif), y buscar la última fecha de modificación de cada uno de ellos.


Aquí hay una solución posible, sobre la base de la clase DirectoryIterator del 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); 


Por supuesto, también se puede hacer lo mismo con readdir() y otras funciones correspondientes.

+0

php debería haber incorporado una función tal manera que no es necesario analizar todos dir .. imo – dynamic

+0

Escribir esta función no es tan difícil ;-) ;;; y parece necesario que sea un poco específico, por lo que podría ser comprensible para los desarrolladores centrales no desear implementar dicha función en PHP. –

+0

incluso aunque no hayas comprobado que exstension jajaja voy a aceptar esto porque estoy seguro de que readdir (o este equivalente) es más rápido que un glob + otro análisis – dynamic

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 ''; 
} 
Cuestiones relacionadas