Cómo ordenar archivos por fecha en PHP
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);
}
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ó filemtime
al ordenar los archivos, no hay ningún costo adicional al llamarlo nuevamente en el bucle foreach debido al caché de estadísticas .
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.
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];
});
$files = array_diff(scandir($dir,SCANDIR_SORT_DESCENDING), array('..', '.'));
print_r($files);