2010-04-19 14 views
41

Attualmente ho un file index.php che mi permette di mostrare l'elenco dei file all'interno della stessa directory, l'output mostra i nomi poi ho usato la funzione filemtime() per mostrare la data in cui il file è stato modificato. il mio problema ora è, come ordinerò l'output per mostrare l'ultimo file modificato?, ho pensato per un po 'come farlo. se lo faccio solo con l'interazione mysql non ci saranno problemi. per favore mostrami un esempio su come ordinare e produrre l'elenco dei file a partire dall'ultimo modificato. questo è quello che ho per oraordina i file per data in PHP

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); 
} 

risposta

19

È necessario inserire i file in un array per ordinare e trovare l'ultimo file modificato.

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

Non testato, ma è così che si fa.

+14

@sasori nota che questa soluzione non funzionerà correttamente quando hai file con lo stesso mtime, poiché sovrascriverà il nome file precedente per quel mtime. – Gordon

+2

Esattamente Gordon, vorrei che ci sarebbe stato un modo per rendere i commenti di BUMP più visibili visto che ho passato un'ora a scavare su ciò che era sbagliato .. Apparentemente, l'idea dietro il codice sopra è corretta, ma questo bug lo rende assolutamente inutile . –

+0

Modificato il codice per rendere il tasto univoco (aggiungendo ripetutamente un secondo). Confonderà un po 'le cose quando alcuni file hanno un secondo diverso (ma non identico), ma non importa nella maggior parte dei casi. –

137

Questo sarebbe ottenere tutti i file in path/to/file con estensione .swf in un array e poi ordinare la matrice dalla mtime del file

$files = glob('path/to/files/*.swf'); 
usort($files, function($a, $b) { 
    return filemtime($a) < filemtime($b); 
}); 

Il sopra utilizza Lambda function e richiede PHP 5.3. Prima di 5.3, si farebbe

usort($files, create_function('$a,$b', 'return filemtime($a)<filemtime($b);')); 

Se non si desidera utilizzare una funzione anonima, si può altrettanto bene definire il callback come una normale funzione e passare il nome della funzione di usort invece.

Con la matrice risultante, si sarebbe poi scorrere i file in questo modo:

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))); 
} 

noti che perché già chiamato filemtime durante l'ordinamento dei file, non v'è alcun costo aggiuntivo quando si chiama di nuovo in foreach loop dovuto allo stat cache.

+2

-1 Non si utilizza il suo codice e usort è la peggiore funzione di ordinamento da utilizzare in quel caso. Ma l'inferno, tutti votano per te perché sembra stravagante. * - * – elias

+30

@elias Senza offesa, ma trovo ridicolo ridimensionare una risposta perfettamente valida per i motivi che hai fornito. Parlando di leggibilità, il tuo codice impiega molto più tempo a capire del mio. Lo chiamerei codice degli spaghetti. E se non sei soddisfatto dell'usort usort di essere così terribile, che presentare un reclamo con il bugtracker di PHP. – Gordon

+0

Ammesso che questa domanda sia vecchia, sto per usare 'usort()' adesso; pregare, qual è il problema con 'usort()'? (In riferimento al commento di @elias sopra.) –

8

Un esempio che utilizza la classe RecursiveDirectoryIterator, è un modo conveniente per scorrere in modo ricorsivo sul filesystem.

$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]; 
}); 
+0

le persone devono adottare l'approccio OOP in PHP per renderlo competitivo ad altre lingue. –

+1

@RaheelKhan Perché? Usa OOP quando risolve i problemi più facilmente, non utilizzare OOP quando è più complicato. OOP non rende nulla di meglio, né il tuo codice, né una lingua. Permette solo alcuni problemi di risolvere in modo più efficiente (quello che non credo sia il caso qui). –

+0

+1 per '>'; Non capivo perché altre risposte fossero fallite per quanto riguardava il mio codice, ma il tuo 'successo'. L'operatore di confronto giusto: '>' invece di '<'. – 1111161171159459134

0

Uso il codice esatto proposto con solo alcune righe aggiuntive. L'idea è più o meno la stessa di quella proposta da @elias, ma in questa soluzione non ci possono essere conflitti sulle chiavi poiché ogni file nella directory ha un nome file diverso e quindi aggiungerlo alla chiave risolve i conflitti. La prima parte della chiave è la stringa datetime formattata in modo tale da poter confrontare lessicograficamente due di essi.

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

$ file = array_diff (scandir ($ dir, SCANDIR_SORT_DESCENDING), array ('.. ')'.'); print_r ($ file);