Cómo ordenar archivos por fecha en PHP

Resuelto sasori asked hace 54 años • 6 respuestas

Actualmente tengo un script que me permite generar la lista de archivos dentro del mismo directorio.

El resultado muestra los nombres y luego utilicé filemtime()la función para mostrar la fecha en que se modificó el archivo.

¿Cómo ordenaré la salida para mostrar el último archivo modificado?

Esto es lo que tengo por ahora:

if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $lastModified = date('F d Y, H:i:s', filemtime($file));
            if(strlen($file)-strpos($file, ".swf") == 4) {
                echo "$file - $lastModified";
            }
        }
    }
    closedir($handle);
}
sasori avatar Jan 01 '70 08:01 sasori
Aceptado

Esto colocaría todos los archivos en la ruta/a/archivos con una extensión .swf en una matriz y luego ordenaría esa matriz según el mtime del archivo.

$files = glob('path/to/files/*.swf');
usort($files, function($a, $b) {
    return filemtime($b) - filemtime($a);
});

Lo anterior utiliza una función Lambda y requiere PHP 5.3. Antes de 5.3, harías

usort($files, create_function('$a,$b', 'return filemtime($b)-filemtime($a);'));

Si no desea utilizar una función anónima, también puede definir la devolución de llamada como una función normal y pasarle el nombre de la función usort.

Con la matriz resultante, luego iterarías sobre los archivos de esta manera:

foreach($files as $file){
    printf('<tr><td><input type="checkbox" name="box[]"></td>
            <td><a href="%1$s" target="_blank">%1$s</a></td>
            <td>%2$s</td></tr>', 
            $file, // or basename($file) for just the filename w\out path
            date('F d Y, H:i:s', filemtime($file)));
}

Tenga en cuenta que debido a que ya llamó filemtimeal ordenar los archivos, no hay ningún costo adicional al llamarlo nuevamente en el bucle foreach debido al caché de estadísticas .

Gordon avatar Apr 19 '2010 11:04 Gordon

Debe colocar los archivos en una matriz para ordenar y encontrar el último archivo modificado.

$files = array();
if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
           $files[filemtime($file)] = $file;
        }
    }
    closedir($handle);

    // sort
    ksort($files);
    // find the last modification
    $reallyLastModified = end($files);

    foreach($files as $file) {
        $lastModified = date('F d Y, H:i:s',filemtime($file));
        if(strlen($file)-strpos($file,".swf")== 4){
           if ($file == $reallyLastModified) {
             // do stuff for the real last modified file
           }
           echo "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>";
        }
    }
}

No probado, pero así es como se hace.

elias avatar Apr 19 '2010 11:04 elias

A continuación se muestra un ejemplo que utiliza la clase RecursiveDirectoryIterator . Es una forma conveniente de iterar recursivamente sobre el sistema de archivos.

$output = array();
foreach( new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator( 'path', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS ) ) as $value ) {
        if ( $value->isFile() ) {
            $output[] = array( $value->getMTime(), $value->getRealPath() );
        }
}

usort ( $output, function( $a, $b ) {
    return $a[0] <=> $b[0];
});
Danijel avatar Apr 02 '2015 19:04 Danijel
$files = array_diff(scandir($dir,SCANDIR_SORT_DESCENDING), array('..', '.'));
print_r($files);
Wynn avatar Feb 06 '2018 16:02 Wynn