2011-10-04 19 views
15

Sto usando la classe DirectoryIterator di php per elencare i file in una directory. Non riesco comunque a capire un modo semplice per ordinare i file per data. Come è questo fatto con DirectoryIteratorphp DirectoryIterator ordina i file per data

<?php 
$dir = new DirectoryIterator('.'); 
    foreach ($dir as $fileinfo) {  
    echo $fileinfo->getFilename() . '<br>'; 
    } 
?> 

E se nomino miei file come whatever_2342345345.ext in cui i numeri rappresentano il tempo in millisecondi in modo che ogni file ha un numero univoco. Come possiamo ordinare guardando i numeri dopo il carattere di sottolineatura

risposta

20

Se è necessario ordinare, creare un array e ordinarlo.

$files = array(); 
$dir = new DirectoryIterator('.'); 
foreach ($dir as $fileinfo) {  
    $files[$fileinfo->getMTime()][] = $fileinfo->getFilename(); 
} 

ksort($files); 

Questo costruirà un array con il tempo modificato come chiave e un array di nomi di file come valore. Quindi ordina tramite ksort(), che ti darà i nomi dei file in ordine di tempo modificato.

Se poi si vuole ri-appiattire la struttura a una matrice standard, è possibile utilizzare ...

$files = call_user_func_array('array_merge', $files); 
+10

Devo dire che si sbaglia poco dicendo "Un iteratore esiste per fare proprio questo, iterare". Gli iteratori per loro natura potrebbero aggiungere funzioni di filtraggio e di ordinamento. Infatti, l'obiettivo di iterator è fornire un'interfaccia per iterare, ma questa definizione non limita l'iteratore a svolgere alcuni lavori interni con i dati. – zerkms

+0

L'esempio che hai fornito non funziona per me. Hai provato. Che cosa succede se nome i miei file come whatever_2342345345.ext dove i numeri rappresentano il tempo in cui ogni file ha un numero univoco. Come possiamo ordinare guardando i numeri dopo il carattere di sottolineatura – Pinkie

+0

@Pinkie: non l'ho provato, ma la teoria dovrebbe essere corretta. Che errore hai ottenuto? Stai guardando '$ files'? – alex

1

Nel caso in cui più file hanno la stessa ora di modifica (aggiornato):

$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); 
1

Se si desidera comunque accedere a tutti i dati disponibili su DirectoryIterator (ad esempio isDot()getSize() ecc.), Un modo possibile è quello di memorizzare la chiave Iterator nell'array che si desidera ordinare e cercare lo in seguito.

$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>'; 
}