Yadda yadda: Dateinamen nach Änderungsdatum in Array sortieren

Ich möchte aus einem Ordner alle Dateien auslesen und diese nach Änderungsdatum sortiert in einem Array auflisten.

Den Code um den Ordner durchzurattern hab ich schon mal:

  
if ($foldername = opendir("docs")) {  
  while (false !== ($filename = readdir($foldername))) {  
    if ($filename != "." && $filename != "..") {  
      [Und jetzt? Was nun?]  
    }  
  }  
}  
closedir($foldername);  

Wie ich die Dateinamen in den Array bekomme weiss ich auch:

  
array_push($filelist,$filename);  

Aber wie sortiere ich dessen Inhalt nach Änderungsdatum?

Über Google finde ich kaum brauchbare Erklärungen oder dann ziemlich langen Code. Kann man diese Funktion auch kurz und bündig coden? Was die in diesem Thread schreiben funktioniert bei mir nicht.

  1. Hi Yadda!

    Aber wie sortiere ich dessen Inhalt nach Änderungsdatum?

    Nutze nicht array_push sondern die Syntax $filelist[KEY] = $filename.
    Als KEY vergibst du das Änderungsdatum der Datei (über die Funktion filemtime) und hängst daran noch eine laufende Nummer, also eine Zählvariable, die in der while-Schleife inkrementiert wird. So bekommst du wirklich alle Dateien in das Array, also auch die, die zufälligerweise die selbe Änderungszeit haben.

    Über ksort bzw. krsort kannst du das Array nun auf- bzw. absteigend sortieren.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Hi,

      Aber wie sortiere ich dessen Inhalt nach Änderungsdatum?
      Nutze nicht array_push sondern die Syntax $filelist[KEY] = $filename.
      Als KEY vergibst du das Änderungsdatum der Datei (über die Funktion filemtime) und hängst daran noch eine laufende Nummer, also eine Zählvariable, die in der while-Schleife inkrementiert wird. So bekommst du wirklich alle Dateien in das Array, also auch die, die zufälligerweise die selbe Änderungszeit haben.

      Warum nicht den Dateinamen als Key nehmen - der duerfte innerhalb eines Verzeichnisses ja eindeutig sein - und das Datum als Value?

      Über ksort bzw. krsort kannst du das Array nun auf- bzw. absteigend sortieren.

      Dann kann man anschliessend auch einfach asort() nehmen (oder arsort(), wenn's andersherum sein soll).

      MfG ChrisB

      --
      „This is the author's opinion, not necessarily that of Starbucks.“
      1. Hi ChrisB!

        Warum nicht den Dateinamen als Key nehmen - der duerfte innerhalb eines Verzeichnisses ja eindeutig sein - und das Datum als Value?

        Ich bin mir grad nicht sicher, aber die Dateisysteme, die Linux verwendet sind doch case-sensitiv, oder? Und da PHP case-insensitiv ist, könnte es da zu Problemen kommen.

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. Hi,

          Ich bin mir grad nicht sicher, aber die Dateisysteme, die Linux verwendet sind doch case-sensitiv, oder? Und da PHP case-insensitiv ist, könnte es da zu Problemen kommen.

          Nicht, was Array-Indices angeht.

          MfG ChrisB

          --
          „This is the author's opinion, not necessarily that of Starbucks.“
          1. Hi ChrisB!

            Ich bin mir grad nicht sicher, aber die Dateisysteme, die Linux verwendet sind doch case-sensitiv, oder? Und da PHP case-insensitiv ist, könnte es da zu Problemen kommen.
            Nicht, was Array-Indices angeht.

            Okay, ich geb´ mich geschlagen. =)

            MfG H☼psel

            --
            "It's amazing I won. I was running against peace, prosperity, and incumbency."
            George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
            Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    2. Hi Yadda!

      Aber wie sortiere ich dessen Inhalt nach Änderungsdatum?
      Nutze nicht array_push sondern die Syntax $filelist[KEY] = $filename.
      Als KEY vergibst du das Änderungsdatum der Datei (über die Funktion filemtime)

      Die Dateinamen sind alle eindeutig, ich sorge im Skript schon vornherein, dass keine doppelten Namen vorhanden sind. Alles wird zu Kleinschreibung umgewandelt; ist ein Name schon vorhanden, wird dem neuen eine aufsteigende Zahl hinzugefügt.

      Wäre diese Zeile in der While-Schleife korrekt:

      $filelist[$filename] = filemtime($filename);

      ?

      Diese Arrays mit einem Key, sind das "multidimensionale Arrays", also "$filelist[$filename][$datum]"? Ich hab bisher nur mit einfachen Arrays gearbeitet. Kann man diese auch mit einer If-Schleife abarbeiten oder muss man zwingend Foreach mit "$filelist as $key =>"$value" nehmen?

      1. Vergesst meine Fragen.

        Hab das was ich wollte hinbekommen :)

        1. Hi Yadda!

          Hab das was ich wollte hinbekommen :)

          Schreibst du auch noch, wie du das gelöst hast?
          Es wäre schön, das für´s Archiv festzuhalten.

          MfG H☼psel

          --
          "It's amazing I won. I was running against peace, prosperity, and incumbency."
          George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
          Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
          1.   
              $docslist = array();  
              if ($foldername = opendir("docs")) {  
                while (false !== ($filename = readdir($foldername))) {  
                  if ($filename != "." && $filename != "..") {  
                    $docslist[$filename] = filemtime("docs/".$filename);  
                  }  
                }  
              }  
              closedir($foldername);  
              arsort($docslist);  
            
            

            Das war der "einfache" Teil. Danach kam noch eine While-Schleife, die nur gewisse Inhalte vom Array ausspuckt, z.B. die Inhalte von Position 10-19. Dazu musste ich meinen Code noch mit einer weiteren Schleife (Schlaufe?) und "next($threadlist)" versauen.