frankie: Verzeichnis sortieren vor der Ausgabe

Ich möchte ein Verzeichnis auslesen und nur die Daten nicht die Ordner ausgeben.
Das mache ich so:

  
  
$verzeichnis = openDir('E:/xampp/htdocs/datei/');  
  
while ($file = readDir($verzeichnis))  
	{  
	if ($file != "." && $file != "..")  
		{  
		echo $file.'<br/>';  
		}  
	}  
closeDir($verzeichnis);  

Es funktioniert. Nun würde ich gerne das Verzeichnis sortiert ausgeben, und zwar die neueste Datei zuerst.

Kann mir da jemand behilflich sein?

frankie

  1. Hi,

    Nun würde ich gerne das Verzeichnis sortiert ausgeben, und zwar die neueste Datei zuerst.

    Dann packst du alle Dateien in ein Array, sortierst dieses, und gibst es anschließend in einer zweiten Schleife aus.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi,

      Nun würde ich gerne das Verzeichnis sortiert ausgeben, und zwar die neueste Datei zuerst.

      Dann packst du alle Dateien in ein Array, sortierst dieses, und gibst es anschließend in einer zweiten Schleife aus.

      MfG ChrisB

      Nach dem durchlesen und ausprobieren von GLOB habe ich das hier für das beste für mich rausgefunden.

        
      $verzeichnis = openDir('C:/xampp/htdocs/datei/');  
        
      $sortieren= array();  
        
      while (false !== ($file = readdir($verzeichnis)))  
      	{	  
      	if ($file != "." && $file != "..")  
      		{  
      		$sortieren[]=$file;  
      		}  
      	}  
      closeDir($verzeichnis);  
      arsort($sortieren);  
        
        
      echo "<pre>";  
      print_r($sortieren);  
      echo "</pre>"
      
      1. Tach!

        Nach dem durchlesen und ausprobieren von GLOB habe ich das hier für das beste für mich rausgefunden.

        $verzeichnis = openDir('C:/xampp/htdocs/datei/');

        $sortieren= array();

        while (false !== ($file = readdir($verzeichnis)))
        {
        if ($file != "." && $file != "..")
        {
        $sortieren[]=$file;
        }
        }
        closeDir($verzeichnis);
        arsort($sortieren);

        echo "<pre>";
        print_r($sortieren);
        echo "</pre>"

          
        Das bekämest du als Einzeiler auch mit  
          
        `print_r(array_reverse(glob('C:/xampp/htdocs/datei/')));`{:.language-php}  
          
        hin. Beides ist aber nicht das, was du in deinem Ausgangsposting an Funktionalität gefordert hast.  
          
          
        dedlfix.
        
  2. Moin,

    »» while ($file = readDir($verzeichnis))  
    
    > 	{
    
    

    Der korrekte Weg durch ein Verzeichnis zu laufen ist folgender:

    while (false !== ($file = readdir($verzeichnis))) {  
            // do something  
        }
    

    Es funktioniert. Nun würde ich gerne das Verzeichnis sortiert ausgeben, und zwar die neueste Datei zuerst.
    Kann mir da jemand behilflich sein?

    Du bekommst in deiner Schleife mit filectime() heraus, wann eine Datei angelegt wurde. Du könntest beispielsweise ein assoziatives Array erstellen, welches das Erstellungsdatum als Schlüssel und den Dateinamen als Wert enthält und dieses Array am Ende mit krsort() absteigend nach Schlüsseln sortieren.

    Grüße Marco

    1. Tach!

      »» while ($file = readDir($verzeichnis))
      Der korrekte Weg durch ein Verzeichnis zu laufen ist folgender:
      while (false !== ($file = readdir($verzeichnis)))

      Der schnellste und einfachste Weg, an einen Verzeichnisinhalt zu gelangen: glob(). Um die Ordner auszusortieren, kann man das Flag GLOB_MARK hinzufügen und Verzeichnisse am angehängten / erkennen, ohne noch extra is_dir() abzufeuern. GLOB_NOSORT spart hier auch noch unbedeutenderweise ein klein wenig Zeit, weil ja nach einem eigenen Kriterium sortiert werden soll.

      Außerdem gibt es noch diverse Dateisystemiteratoren, die gleich Objekte liefern, bei denen man die Zugriffszeiten mittels eines Methodenaufrufs ermitteln kann.

      Du bekommst in deiner Schleife mit filectime() heraus, wann eine Datei angelegt wurde. Du könntest beispielsweise ein assoziatives Array erstellen, welches das Erstellungsdatum als Schlüssel

      Nein, das ist nicht empfehlenswert, weil diese Daten nicht im Microsekundenbereich vorgehalten werden und somit nicht eindeutig und als Key ungeeignet sind. Die Dateinamen sind hingegen eindeutig und problemlos als Key verwendbar.

      dedlfix.

      1. Moin,

        Der schnellste und einfachste Weg, an einen Verzeichnisinhalt zu gelangen: glob(). Um die Ordner auszusortieren, kann man das Flag GLOB_MARK hinzufügen und Verzeichnisse am angehängten / erkennen, ohne noch extra is_dir() abzufeuern. GLOB_NOSORT spart hier auch noch unbedeutenderweise ein klein wenig Zeit, weil ja nach einem eigenen Kriterium sortiert werden soll.

        Das kann man alles so machen; ich bevorzuge nach wie vor die klassische Methode.

        Außerdem gibt es noch diverse Dateisystemiteratoren, die gleich Objekte liefern, bei denen man die Zugriffszeiten mittels eines Methodenaufrufs ermitteln kann.

        Hier muss man sich aber bewusst sein, dass objektorientierte Syntax vonnöten ist. Für "Amateure" (ohne dem OP zu nahe treten zu wollen), die von objektorientierter Programmierung nicht viel verstehen, sind Iteratoren vielleicht nicht primär das Mittel der Wahl.

        Nein, das ist nicht empfehlenswert, weil diese Daten nicht im Microsekundenbereich vorgehalten werden und somit nicht eindeutig und als Key ungeeignet sind. Die Dateinamen sind hingegen eindeutig und problemlos als Key verwendbar.

        Das stimmt, das hatte ich nicht bedacht. Aber dann macht man es umgekehrt und sortiert nach den Werten.

        Grüße Marco

        1. Tach!

          Der schnellste und einfachste Weg, an einen Verzeichnisinhalt zu gelangen: glob().
          Das kann man alles so machen; ich bevorzuge nach wie vor die klassische Methode.

          Warum? Weil sie umständlicher zu notieren ist und wegen der vielen Funktionsaufrufe auch langsamer als der eine von glob() ist? Oder magst du es, extra per Hand . und .. herauszufiltern, die glob() von sich aus weglässt?

          Außerdem gibt es noch diverse Dateisystemiteratoren, die gleich Objekte liefern, [...]
          Hier muss man sich aber bewusst sein, dass objektorientierte Syntax vonnöten ist. Für "Amateure" (ohne dem OP zu nahe treten zu wollen), die von objektorientierter Programmierung nicht viel verstehen, sind Iteratoren vielleicht nicht primär das Mittel der Wahl.

          Es geht dabei lediglich um die Anwendung von Objekten, nicht um das weitaus schwierigere Designen eines ganzen OOP-Programms. Da ist nur ein klein wenig Syntax zu lernen (falls das noch notwendig ist) und keine komplette Philosophie zu berücksichtigen. Im Grunde ist das nicht schwieriger als mysql_fetch_object() zu verwenden. Der Iterator macht sein "Hexenwerk" im Verborgenen. Der Anwender sieht nur wenig mehr als eine foreach-Schleife. "Deine" klassischen Directory-Funktionen gibt es übrigens auch in objektorientiert. Findest du das dortige Beispiel für Anfänger ungeeignet? Wer sagt außerdem, dass der OP nicht wenigstens mit diesen Grundlagen der Objekt-Verwendung vertraut ist? Ich finde, man kann das problemlos als Alternative nennen. Wenn der OP es dann nicht nehmen will, ist das auch kein Beinbruch.

          dedlfix.

          1. Moin,

            Warum? Weil sie umständlicher zu notieren ist und wegen der vielen Funktionsaufrufe auch langsamer als der eine von glob() ist? Oder magst du es, extra per Hand . und .. herauszufiltern, die glob() von sich aus weglässt?

            Nein, ich filtere . und .. nicht, dafür aber andere (konfigurierbare) Sachen, wie .ht*-Dateien, $_SERVER['SCRIPT_NAME'] oder nach bestimmten Regex-Ausdrücken

            Im Grunde ist das nicht schwieriger als mysql_fetch_object() zu verwenden.

            Stimmt. Ich kenne aber niemanden, der nicht objektorientiert Programmiert und mysql_fetch_object() statt mysql_fetch_assoc() benutzt. Is ja auch wurscht. Klar, kann man mit Objekten arbeiten. Die Performanz wird aber in kleineren Beispielen nicht durch den Einsatz klassischer Methoden relevant leiden.

            Findest du das dortige Beispiel für Anfänger ungeeignet?

            Nein. Aber gerade an dieser Stelle ist es meines Erachtens inkonsequent ein Objekt nur um des Objekts willen zu nutzen, statt die klassischen Funktionen; zumal das Statement fast gleich aussieht.
            Ich persönlich programmiere entweder objektorientiert, oder imperativ; nicht gemischt.

            Ich finde, man kann das problemlos als Alternative nennen. Wenn der OP es dann nicht nehmen will, ist das auch kein Beinbruch.

            Ja, natürlich :)

            Grüße Marco

  3. Moin!

    Kann mir da jemand behilflich sein?

    Indem Du nicht sofort ausgibst, was Du findest sondern es in ein array schreibst und das dann sortierst, bevor Du es ausgibst.

    --
    Signaturen sind blöd!