2012-08-12 9 views
13

Ich versuche scandir(); Funktion über seine geschriebenen Grenzen zu gehen, ich brauche mehr als die Alpha-Sortierung es derzeit unterstützt. Ich muss die scandir(); Ergebnisse sortiert nach Änderungsdatum sortieren.scandir() zu sortieren nach Datum geändert

Ich habe ein paar Lösungen ausprobiert, die ich hier und einige andere Lösungen von verschiedenen Websites gefunden habe, aber keine funktionierte für mich, also denke ich, dass es sinnvoll ist, hier zu posten.

Was ich bisher versucht, ist dies:

function scan_dir($dir) 
{ 
    $files_array = scandir($dir); 
    $img_array = array(); 
    $img_dsort = array(); 
    $final_array = array(); 

    foreach($files_array as $file) 
    { 
     if(($file != ".") && ($file != "..") && ($file != ".svn") && ($file != ".htaccess")) 
     { 
      $img_array[] = $file; 
      $img_dsort[] = filemtime($dir . '/' . $file); 
     } 
    } 

    $merge_arrays = array_combine($img_dsort, $img_array); 
    krsort($merge_arrays); 

    foreach($merge_arrays as $key => $value) 
    { 
     $final_array[] = $value;  
    } 

    return (is_array($final_array)) ? $final_array : false; 
} 

Aber das scheint nicht zu funktionieren für mich, es 3 Ergebnisse liefert nur, aber es sollte 16 Ergebnisse zurückgeben, weil es 16 Bilder im Ordner.

Antwort

68
function scan_dir($dir) { 
    $ignored = array('.', '..', '.svn', '.htaccess'); 

    $files = array();  
    foreach (scandir($dir) as $file) { 
     if (in_array($file, $ignored)) continue; 
     $files[$file] = filemtime($dir . '/' . $file); 
    } 

    arsort($files); 
    $files = array_keys($files); 

    return ($files) ? $files : false; 
} 
+0

@dugi versuchen, diese Methode. Die Dateinamen in einem einzelnen Verzeichnis sollten eindeutig sein. Daher können sie als Schlüssel verwendet werden. Das Array wird dann nach Werten (der Änderungszeit) sortiert und die Schlüssel (die Dateinamen) werden in der richtigen Reihenfolge zurückgegeben. –

+0

Versuchte es und arbeitete wie ein Charme. Danke Ryoin. – Aborted

+0

Arbeiten wie ein Charme! – BSQ

0

ich glaube, das Problem in Ihrem ursprünglichen Code ist mehrere Dateien gleichen Änderungsdatum/Zeit damit haben könnte, wenn die Arrays die Kombination mehrerer Dateieinträge mit dem gleichen Änderungsdatum/Zeit wird überschrieben, und Sie werden nur nur einen Eintrag bekommen im letzten Array für diesen Zeitstempel.

+0

Ich verstehe was du meinst. Gibt es eine Möglichkeit, das zu beheben? – Aborted

0

Alternative Beispiel ..

$dir = "/home/novayear/public_html/backups"; 
chdir($dir); 
array_multisort(array_map('filemtime', ($files = glob("*.{sql,php,7z}", GLOB_BRACE))), SORT_DESC, $files); 
foreach($files as $filename) 
{ 
    echo "<a>".substr($filename, 0, -4)."</a><br>"; 
}