it-swarm.com.de

scandir () zum Sortieren nach Änderungsdatum

Ich versuche, die scandir();-Funktion über ihre schriftlichen Grenzen hinaus zu bringen. Ich brauche mehr als die Alpha-Sortierung, die derzeit unterstützt wird. Ich muss die scandir();-Ergebnisse sortieren, um nach Änderungsdatum sortiert zu werden. 

Ich habe ein paar Lösungen ausprobiert, die ich hier gefunden habe, und einige andere Lösungen von verschiedenen Websites, aber keine hat für mich funktioniert. Ich denke, es ist vernünftig, hier zu posten.

Was ich bisher ausprobiert habe, ist folgendes:

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

Dies scheint jedoch für mich nicht zu funktionieren, es werden nur 3 Ergebnisse zurückgegeben, aber es sollten 16 Ergebnisse zurückgegeben werden, da der Ordner 16 Bilder enthält.

15
Dugi
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;
}
79
Ryon Sherman

Dies ist eine großartige Frage und Ryon Shermans Antwort liefert eine solide Antwort, aber ich brauchte etwas mehr Flexibilität für meine Bedürfnisse, also habe ich diese neuere Funktion erstellt: better_scandir.

Das Ziel ist, dass scandir Sortierreihenfolgeflags wie erwartet funktionieren. nicht nur die umgekehrte Array-Sortiermethode in Ryons Antwort. Und auch das explizite Setzen von SORT_NUMERIC für die Array-Sortierung, da diese Zeitwerte eindeutig Zahlen sind.

Die Verwendung ist wie folgt; schalte einfach aus SCANDIR_SORT_DESCENDING bis SCANDIR_SORT_ASCENDING oder leer lassen:

better_scandir(<filepath goes here>, SCANDIR_SORT_DESCENDING);

Und hier ist die Funktion selbst:

function better_scandir($dir, $sorting_order = SCANDIR_SORT_ASCENDING) {

  /****************************************************************************/
  // Roll through the scandir values.
  $files = array();
  foreach (scandir($dir, $sorting_order) as $file) {
    if ($file[0] === '.') {
      continue;
    }
    $files[$file] = filemtime($dir . '/' . $file);
  } // foreach

  /****************************************************************************/
  // Sort the files array.
  if ($sorting_order == SCANDIR_SORT_ASCENDING) {
    asort($files, SORT_NUMERIC);
  }
  else {
    arsort($files, SORT_NUMERIC);
  }

  /****************************************************************************/
  // Set the final return value.
  $ret = array_keys($files);

  /****************************************************************************/
  // Return the final value.
  return ($ret) ? $ret : false;

} // better_scandir
2
JakeGould

Ich denke, das Problem in Ihrem ursprünglichen Code ist, dass mehrere Dateien dasselbe Änderungsdatum/-zeit haben könnten. Wenn Sie also die Arrays kombinieren, werden mehrere Dateieinträge mit demselben Änderungsdatum/-uhrzeitpunkt überschrieben, und Sie erhalten nur einen Eintrag im endgültigen Array für diesen Zeitstempel .

0
bpatel

Alternatives 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>"; 
}  
0
NovaYear