2010-02-24 25 views

Respuesta

8

salvar su información a una matriz, ordenar la matriz y luego bucle de la matriz

if($h = opendir($dir)) { 
    $files = array(); 
    while(($file = readdir($h) !== FALSE) 
    $files[] = stat($file); 

    // do the sort 
    usort($files, 'your_sorting_function'); 

    // do something with the files 
    foreach($files as $file) { 
    echo htmlspecialchars($file); 
    } 
} 
2

Je, ni siquiera el gran DirectoryIterator puede hacer que fuera de la caja. Suspiro.

Parece que hay una secuencia de comandos bastante poderosa para hacer todo lo que se hace referencia aquí: preg_find. Nunca he trabajado con eso, pero se ve bien.

sorted in by filesize, in descending order? 
$files = preg_find('/./', $dir, 
    PREG_FIND_RECURSIVE| PREG_FIND_RETURNASSOC | 
    PREG_FIND_SORTFILESIZE|PREG_FIND_SORTDESC); 

$files=array_keys($files); 
0

Usted podría utilizar scandir() para leer el contenido del directorio en una matriz, a continuación, utilizar fileatime() o filectime() para ver el acceso o la creación de tiempo de cada archivo, respectivamente. Ordenar la matriz desde aquí no debería ser demasiado difícil.

3

Puede almacenar los archivos en una matriz, donde la clave es el nombre de archivo y el valor es el valor para ordenar por (es decir, fecha de creación) y usar asort() en esa matriz.

$files = array(
    'file1.txt' => 1267, 
    'file3.txt' => 1267011892, 
    'file2.txt' => 1266971321, 
); 
asort($files); 
var_dump(array_keys($files)); 
# Output: 
array(3) { 
    [0]=> 
    string(9) "file2.txt" 
    [1]=> 
    string(9) "file3.txt" 
    [2]=> 
    string(9) "file1.txt" 
} 
-2

usa shell_exec para ejecutar el comando en os-level? en una caja de linux/unix esto podría funcionar;

$output=shell_exec('ls -t1'); 
+3

... por favor no lo hagas. – knittl

5

Esa es mi solución:

$fileList = array(); 
$files = glob('home/dir/*.txt'); 
foreach ($files as $file) { 
    $fileList[filemtime($file)] = $file; 
} 
ksort($fileList); 
$fileList = array_reverse($fileList, TRUE); 
print_r($filelist); 

salida es la siguiente:

array(
    (int) 1340625301 => '/home/dir/file15462.txt', 
    (int) 1340516112 => '/home/dir/file165567.txt', 
    (int) 1340401114 => '/home/dir/file16767.txt' 
) 

Luego, con bucle "foreach" tomar el archivo que necesita.

+0

Esperemos que ninguno de sus archivos se modifique dentro del mismo segundo de tiempo de Unix. – salathe

+0

@salathe ¡Buen punto! – trante

+0

Reemplacé la línea del cuerpo de foreach con: $ fileList [filemtime ($ file). $ File] = $ file; Resuelve el problema que salathe menciona. Tengo la impresión de que esta conversión de clave a cadena también hace que ksort sea mucho más rápido para mis archivos de 300k. –

Cuestiones relacionadas