Mittels glob nach filemtime sortieren

Status
Nicht offen für weitere Antworten.

rernanded

Erfahrenes Mitglied
Hallo, wie kann ich die Ausgabe/Liste der .pdf nach filemtime sortieren - jüngste zuoberst? MONI
PHP:
foreach (glob("{antworten/*.pdf}", GLOB_BRACE|GLOB_NOSORT) as $filename) {

//foreach (glob("{antworten/*.jpg,png,gif}", GLOB_BRACE|GLOB_NOSORT) as $filename) {

    echo "<a href=\"$filename\">".$filename."</a> /// " . filesize($filename) ." /// ". date ("Y-m-d H:i:s", filemtime($filename)) . "<br />";

}
 
Sieh dir usort an, damit kannst Du ein Array nach beliebigen Kriterien sortieren. In der Doku findest Du Beispiele.
 
Man braucht keine Vergleichsfunktion, das geht doch viel einfacher:
PHP:
<?php

   $files = glob("{antworten/*.pdf}", GLOB_BRACE|GLOB_NOSORT);
  
   $data = [];
  
   foreach($files as $file)
      $data[$file] = date ("Y-m-d H:i:s", filemtime($file));

   natsort($data);
  
   foreach($data as $filename => $filemtime)
     echo "Filename: $filename, filemtime = $filemtime<br>";
?>
 
Zwei Iterationen und ein Sortiervorgang gegenüber einem einzigen Sortiervorgang bei usort - einfacher geht anders. Und performanter auch.
 
Tja, die Funktion habe ich mir auch gedacht/gemacht:
create_function('$a, $b', 'return filemtime($a) - filemtime($b);'

Aber bdt600's Lösung ist okay, danke.

Wie sortiere ich "jüngste" zuoberst?
Ist arsort statt natsort okay? Bei mir funktioniert's?

Eleganter wäre usort schrieb mir auch ein Bekannter.

Ist aber lediglich eine interne Anwendung für mich, vor daher verschmerzbar.

MONI
 
Zuletzt bearbeitet:
Zwei Iterationen und ein Sortiervorgang gegenüber einem einzigen Sortiervorgang bei usort - einfacher geht anders. Und performanter auch.
Ich habe das mal getestet

100.000 Dateien anlegen:
PHP:
<?php
   for ($i = 1; $i <= 100000; $i++)
   {
      $name = sprintf("%06d", $i) . ".txt";
    
      touch ($name);
   }
?>

Und dann mit beiden Varianten sortieren:
PHP:
<?php
   function mysort($file1, $file2)
   {
      if (filemtime($file1) == filemtime($file2))
        return 0;

      return (filemtime($file1) < filemtime($file2)) ? -1 : 1;
   }

   // Variante 1
   $t1 = microtime(true);
 
   $files = glob("*.txt", GLOB_BRACE|GLOB_NOSORT);
 
   $data = [];
 
   foreach($files as $file)
      $data[$file] = filemtime($file);

   natsort($data);

   $t2 = microtime(true);
 
   // Variante 2
   $files = glob("*.txt", GLOB_BRACE|GLOB_NOSORT);
  
   usort($files, "mysort");
 
   $t3 = microtime(true);
 
   echo "Laufzeit Variante 1: " . ($t2 - $t1) . "<br>";
   echo "Laufzeit Variante 2: " . ($t3 - $t2) . "<br>";
?>
Ausgabe:
Laufzeit Variante 1: 8.5317120552063
Laufzeit Variante 2: 94.154689073563

Du kannst mir gerne beweisen, dass usort besser ist, aber da man endlos oft filemtime aufrufen muss, geht die Performance in den Keller.

Und da man dann bei der Ausgabe auch noch einmal filemtime pro Datei aufrufen müsste, ist die Differenz noch größer.
 
Status
Nicht offen für weitere Antworten.
Zurück