school - php DirectoryIterator ordenar archivos por fecha
reorder array php (3)
En caso de que varios archivos tengan el mismo tiempo modificado (actualizado):
$files = array();
$mtimes = array();
$dir = new DirectoryIterator(''.'');
foreach($dir as $file){
if(!$file->isFile())
continue;
$mtime = $file->getMTime();
if(!$mtimes[$mtime]){
$files[$mtime.''.0''] = $file->getFilename();
$mtimes[$mtime] = 1;
}else{
$files[$mtime.''.''.$mtimes[$mtime]++] = $file->getFilename();
}
}
ksort($files);
Estoy usando la clase DirectoryIterator
de php para listar archivos en un directorio. Sin embargo, no puedo encontrar una manera fácil de ordenar los archivos por fecha. ¿Cómo se hace esto con DirectoryIterator?
<?php
$dir = new DirectoryIterator(''.'');
foreach ($dir as $fileinfo) {
echo $fileinfo->getFilename() . ''<br>'';
}
?>
¿Qué pasa si nombro mis archivos como cualquiera que sea_2342345345.ext donde los números representan el tiempo en milisegundos para que cada archivo tenga un número único? ¿Cómo podemos ordenar mirando los números después de subrayar?
Si aún desea acceder a todos los datos disponibles en DirectoryIterator
(por ejemplo, isDot()
getSize()
etc.) una forma posible es almacenar la clave del iterador en la matriz que va a ordenar y buscar el DirectoryIterator
más adelante.
$sorted_keys = array();
$dir_iterator = new DirectoryIterator(''.'');
foreach ( $dir_iterator as $fileinfo )
{
$sorted_keys[$fileinfo->getMTime()] = $fileinfo->key();
}
ksort($sorted_keys);
/* Iterate `DirectoryIterator` as a sorted array */
foreach ( $sorted_keys as $key )
{
$dir_iterator->seek($key);
$fileinfo = $dir_iterator->current();
/* Use $fileinfo here as a normal DirectoryIterator */
echo $fileinfo->getFilename() . '' '' . $fileinfo->getSize() . ''<br>'';
}
Si necesitas ordenar, crea una matriz y ordena eso.
$files = array();
$dir = new DirectoryIterator(''.'');
foreach ($dir as $fileinfo) {
$files[$fileinfo->getMTime()][] = $fileinfo->getFilename();
}
ksort($files);
Esto creará una matriz con el tiempo modificado como la clave y una matriz de nombres de archivos como el valor. Luego se ordena a través de ksort()
, que le dará los nombres de los archivos en orden de tiempo modificado.
Si luego desea volver a aplanar la estructura a una matriz estándar, puede usar ...
$files = call_user_func_array(''array_merge'', $files);