obtener - ordenar archivos por fecha en PHP
ordenar array php (5)
Actualmente tengo un archivo index.php que me permite generar la lista de archivos dentro del mismo directorio, el resultado muestra los nombres, luego utilicé la función filemtime () para mostrar la fecha en que se modificó el archivo. mi problema ahora es, ¿cómo ordenaré la salida para mostrar el último archivo modificado? He estado pensando por un tiempo cómo hacer esto. si solo lo hago con interacción mysql no habrá ningún problema. por favor, muéstreme un ejemplo de cómo ordenar y sacar la lista de archivos a partir de la última modificación. 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 "<tr><td><input type=/"checkbox/" name=/"box[]/"></td><td><a href=/"$file/" target=/"_blank/">$file</a></td><td>$lastModified</td></tr>";
}
}
}
closedir($handle);
}
$ files = array_diff (scandir ($ dir, SCANDIR_SORT_DESCENDING), array (''..'', ''.'')); print_r ($ archivos);
Debe colocar los archivos en una matriz para ordenar y buscar 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 hacerlo.
Esto obtendría todos los archivos en path / to / files con una extensión .swf en una matriz y luego ordenaría esa matriz por el mtime del archivo
$files = glob(''path/to/files/*.swf'');
usort($files, function($a, $b) {
return filemtime($a) < filemtime($b);
});
Lo anterior usa una función Lambda y requiere PHP 5.3. Antes de 5.3, harías
usort($files, create_function(''$a,$b'', ''return filemtime($a)<filemtime($b);''));
Si no desea usar una función anónima, puede definir la devolución de llamada como una función normal y pasar el nombre de la función a la usort
en usort
lugar.
Con la matriz resultante, iteraría sobre los archivos como este:
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ó a filemtime
al ordenar los archivos, no hay un costo adicional cuando se lo vuelve a llamar en el bucle foreach debido a la caché de estadísticas .
Un ejemplo que usa 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];
});
Utilizo tu código propuesto exacto con solo unas pocas líneas adicionales. La idea es más o menos la misma propuesta por @elias, pero en esta solución no puede haber conflictos en las claves, ya que cada archivo en el directorio tiene un nombre de archivo diferente, por lo que al agregarlo a la clave se resuelven los conflictos. La primera parte de la clave es la cadena de fecha y hora formateada de manera que pueda comparar lexicográficamente dos de ellas.
if ($handle = opendir(''.'')) {
$result = array();
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){
$result [date(''Y-m-d H:i:s'',filemtime($file)).$file] =
"<tr><td><input type=/"checkbox/" name=/"box[]/"></td><td><a href=/"$file/" target=/"_blank/">$file</a></td><td>$lastModified</td></tr>";
}
}
}
closedir($handle);
krsort($result);
echo implode('''', $result);
}