Guma: Verzeichnis nach Datum sortiert auslesen.

Hallo und guten Mittag, ich möchte ein Verzeichnis nach datum (zuletzt geänderte Datei oben) auslesen. Das Auslesen klappt mit meinem Script soweit auch ganzgut:

$dir = "../images/";
$dh = opendir( $dir );

//alle jpgs aus dir auslesen
while( $filename = readdir( $dh ) ) {
$filepath = $dir.$filename;
if( is_file( $filepath )
&& ereg( ".jpg$", $filename ) ) {
$gallery[] = $filepath;
}
}
// Der Array wird alphabetisch sortiert
sort( $gallery );

So und da wären wir schon. Ich will es nicht alpabetisch, sondern nach Datum ausgeben (array sortieren)

Ich denke da beim Einlesen des Verzeichnisinhaltes dieses filemtime anzuwenden. Diesen Wert würde ich gerne als Key eines Arrays welches ich dabei aufbaue.  Das so entstandene Array kann ich dann mit der *sort Funktionen sortieren lassen.

Aber wenn zwei Dateien die gleiche filetime haben!?? Dann wird der Eintrag mit dem zweiten Value überschrieben?!
Benötige ich ein 2.dimensionales Array?

Etwa so? Ich mache erst ein Array pro Datei $file = array(date => filedate($gallery ), name => filename($gallery )) und erstelle dabei ein Array $files[] = $file . Dann mit sort() sortieren lassen. Da es aber ein numerisches ist, werden die Values des ersten Eintrag des $file-Arrays genommen. Ich bin neulich wegen einer ähnliches Sache daraufgestoßen. Falls mir jemand genau weiterhelfen kann wäre ich dankbar. gerne auch mit einer Script-Erweiterung.
Guma

  1. hi,

    Ich denke da beim Einlesen des Verzeichnisinhaltes dieses filemtime anzuwenden. Diesen Wert würde ich gerne als Key eines Arrays welches ich dabei aufbaue.

    Nein, willst du nicht, denn -

    Aber wenn zwei Dateien die gleiche filetime haben!?? Dann wird der Eintrag mit dem zweiten Value überschrieben?!

    Eben.

    Benötige ich ein 2.dimensionales Array?

    Ja, zum Beispiel.

    Dann mit sort() sortieren lassen. Da es aber ein numerisches ist, werden die Values des ersten Eintrag des $file-Arrays genommen.

    array_multisort() lässt sich u.U. dazu benutzen - aber diese Funktion halte ich für ziemlichen Murks.

    Viel einfacher ist es m.E., usort() zu benutzen, und sich eine klitzekleine Vergleichsfunktion zu erstellen. Beispiele siehe Manual.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Danke für die Antworten. ich kam zurecht und konnte es dank der Hilfe hier umsetzen, was ich wollte. Vielenb dank für die Anregungen und Erklärungen. Grüße von Guma

    2. Hello,

      Dann mit sort() sortieren lassen. Da es aber ein numerisches ist, werden die Values des ersten Eintrag des $file-Arrays genommen.

      array_multisort() lässt sich u.U. dazu benutzen - aber diese Funktion halte ich für ziemlichen Murks.

      Viel einfacher ist es m.E., usort() zu benutzen, und sich eine klitzekleine Vergleichsfunktion zu erstellen. Beispiele siehe Manual.

      Viel einfache ist es mMn, den Aufbau des Arrays gleich passend zu wählen. PHP machts möglich:

      $_directory = array();
        $_directory['filename']  = array();
        $_directory['filectime'] = array();
        $_directory['rights']    = array();

      Und dann beim Insert einfach einen Counter mitlaufne lassen

      $count = 0;

      while (($filename = readdir($dir) !== false)
        {
          ## Zeit und was sonst noch beorgen ...

      $count++;
          $_$directory['filename'][$count] = $filename;
          $_$directory['filectime'][$count] = makeansitime($filectime);  ## selber schreiben :-)
          $_$directory['rights'][$count] = $rights;

      }

      Dann kann man jede Spalte für sich mit natsort() sortieren lassen, und je nachdem, nach welcher Sortierung angezeigt werden soll, nimmt man die Spalte als "Leitspalte" in die Ausgabe

      foreach($_directory[$leitspalte] as $key => $val)
        {
          echo $_directory[$filename][$key];
          echo $_directory[$filectime][$key];
          echo $_directory[$rights][$key];
        }

      Soweit als Skizze. Ich hoffe, der OP kann etwas damit anfangen.

      Mehr Beispiele findet man im Archiv unter dem Stichwort "category:PHP Spaltenarray".

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

      1. hi,

        Mehr Beispiele findet man im Archiv unter dem Stichwort "category:PHP Spaltenarray".

        Meine Kritik an dieser m.E. nach wie vor immer noch unsinnigen "Verdrehung" der Struktur wohl ebenfalls.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hello,

          Mehr Beispiele findet man im Archiv unter dem Stichwort "category:PHP Spaltenarray".

          Meine Kritik an dieser m.E. nach wie vor immer noch unsinnigen "Verdrehung" der Struktur wohl ebenfalls.

          Was soll daran unsinnig oder falsch sein?
          Ich finde sie für derartige Anwendungsfälle sogar äußerst sinnig!

          Datenstrukturen sind doch nicht gesetzlich festgelegt.
          Und in PHP gibt es doch außer dem Datentyp String gar keine Arrays, sondern die "Arrays" sind Bäume. Warum sollte man sich die also nicht einrichten, wie es praktisch ist?

          Harzliche Grüße vom Berg
          http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau

          1. hi,

            Was soll daran unsinnig oder falsch sein?
            Ich finde sie für derartige Anwendungsfälle sogar äußerst sinnig!

            Ich finde, damit reißt du die Daten aus dem Zusammenhang.

            Und in PHP gibt es doch außer dem Datentyp String gar keine Arrays, sondern die "Arrays" sind Bäume.

            Und "eigentlich" sieht der Baum für diesen konkreten Anwendungsfall doch wohl erst mal so aus:
            Es gibt für jede Datei einen "Zweig", und darunter nochmal die drei "Zweige" bzw. vielleicht eher "Blätter" Dateiname, Änderungszeitpunkt und Dateirechte, die dann die jeweiligen Werte enthalten.

            Was du jedoch daraus machst, ist ein Baum mit den drei Zweigen Dateinamen, Änderungszeitpunkte und Dateirechte.
            Und darunter gibt es jeweils $anzahlDateien viele Blätter mit der jeweiligen Eigenschaft.

            In meinen Augen pervertiert das doch die Struktur der Daten, die du eigentlich Abbilden willst.

            Übertrage es doch mal von den Arrays/Bäumen, die jetzt aktuell benutzt werden, mehr in Richtung Objektorientierung:
            Würdest du da die Datei als Objekt mit den Eigenschaften Name, Zeitpunkt und Rechte sehen? Ich schon.

            Dein Modell in Richtung OO übertragen besteht jedoch aus den drei Objekten Namen, Zeitpunkte und Rechte.

            Warum sollte man sich die also nicht einrichten, wie es praktisch ist?

            Warum normalisiert man z.B. bei der Erstellung einer Datenbank - das ist manchmal auf den ersten Blick auch nicht "praktisch".

            Darüber hinaus halte ich dein Datenmodell für "gefährlich" - die richtige Zuordnung der einzelnen Eigenschaften basiert bei dir ausschließlich auf den nummerischen Indizes - _und_ deren immer korrepsondierender Sortierung.

            Jetzt sortiere doch irgendwo mal aus Versehen nur das Array $_directory['filename'] - schon hast du Datenmüll, denn der Bezug zu den anderen Eigenschaften in den anderen Arrays ist damit futsch.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Hello,

              Darüber hinaus halte ich dein Datenmodell für "gefährlich" - die richtige Zuordnung der einzelnen Eigenschaften basiert bei dir ausschließlich auf den nummerischen Indizes - _und_ deren immer korrepsondierender Sortierung.

              Wieso 'korrespondierender' Sortierung?
              Da hast Du mein Modell einfach noch nicht verstanden.

              Sortiert werden muss nur die Spalte, nach deren Sortierung man arbeiten möchte. Alle anderen Spalten können unberührt bleiben. Beim Sortieren mit z.B. natsort() bleiben die Schlüssel selbstverständlich erhalten.

              Die einzelnen Felder eines Datensatzes lassen sich über den Index immer wieder zusammenführen.

              Das Ding nennt sich nicht umsonst "Spaltenarray", da hier ganz einfach Spalten einer Tabelle abgetrennt, hinzugefügt, sortiert werden können.

              Und bei langen Spaltennamen spart dieses Vorgehen außerdem Speicherplatz ;-))

              Harzliche Grüße vom Berg
              http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau

              1. hi,

                Wieso 'korrespondierender' Sortierung?
                Da hast Du mein Modell einfach noch nicht verstanden.

                Möglich.

                Und seinen "Sinn" bzw. echten Vorteil auf jeden Fall noch nicht.

                Und bei langen Spaltennamen spart dieses Vorgehen außerdem Speicherplatz ;-))

                Das kannst du mit Konstanten ebenso erreichen.

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
                1. Hello,

                  Ein Nutzen liegt in der Möglichkeit, einfach die in PHP vorhandenen Sortierfuntionen pro Spalte benutzen zu können. Wenn man über mehrere Dimensionen sortiren muss, geht es natürlich nicht mehr.

                  Das kannst du mit Konstanten ebenso erreichen.

                  Mit welchen Konstanten?

                  Harzliche Grüße vom Berg
                  http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau

                  1. hi,

                    Ein Nutzen liegt in der Möglichkeit, einfach die in PHP vorhandenen Sortierfuntionen pro Spalte benutzen zu können.

                    Wie schon gesagt, halte ich mit usort() auch nicht für komplizierter.

                    Wenn man über mehrere Dimensionen sortiren muss, geht es natürlich nicht mehr.

                    Ups, Vorteil futsch :-)

                    Das kannst du mit Konstanten ebenso erreichen.

                    Mit welchen Konstanten?

                    Mit denen, die du dir vorher definierst.

                    Statt
                     $_directory['filename'] = ...
                     $_directory['filectime'] = ...
                     $_directory['rights'] = ...
                    verwendest du dann halt
                     $_directory[FILENAME] = ...
                     $_directory[FILECTIME] = ...
                     $_directory[RIGHTS] = ...

                    • wobei du diese Konstanten vorher mit eindeutigen ein-Byte-Werten definiert hast.

                    gruß,
                    wahsaga

                    --
                    /voodoo.css:
                    #GeorgeWBush { position:absolute; bottom:-6ft; }
                    1. Hello,

                      Ein Nutzen liegt in der Möglichkeit, einfach die in PHP vorhandenen Sortierfuntionen pro Spalte benutzen zu können.

                      Wie schon gesagt, halte ich mit usort() auch nicht für komplizierter.

                      usort() ist aber wesentlich teurer als die vorgefertigten Sortierfunktionen.

                      Wenn man über mehrere Dimensionen sortieren muss, geht es natürlich nicht mehr.

                      Ups, Vorteil futsch :-)

                      Jetzt kannst Du ja usort() mit voller Berechtigung einsetzen :-)

                      Harzliche Grüße vom Berg
                      http://www.annerschbarrich.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      Nur selber lernen macht schlau

                      1. hi,

                        Wie schon gesagt, halte ich mit usort() auch nicht für komplizierter.

                        usort() ist aber wesentlich teurer als die vorgefertigten Sortierfunktionen.

                        Beleg?

                        gruß,
                        wahsaga

                        --
                        /voodoo.css:
                        #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. Hallo,

      
    clearstatcache();  
    $dir = "../images/";  
    $dh = opendir( $dir );  
      
    //alle jpgs aus dir auslesen  
    while(($f=readdir($dh))!==FALSE)  
       if(filetype($dir.$f)=='file' && substr($f,-3)=='jpg')  
          $g[filectime($dir.$f)][]=$dir.$f;  
      
    closedir($dh);  
    krsort($g);  
      
    foreach($g as $v){  
       sort($v);  
       foreach($v as $val)  
          echo $val."\n";  
    }  
    
    

    (Ungetestet)

    Gruß aus Berlin!
    eddi

    --
    Frei nach Goethe: ... Ich bin ein Teil jener Kraft die stets das Gute will... ]:þ
  3. Hello,

    ressourcenschonender wäre es wahrscheinlich, wenn Du Dir die Filenames nebst Zusatzinformationen über exec() besorgen könntest.

    Dann könntest Du diese gleich sortiert ausgeben lassen

    siehe "ls --help" auf Deiner Linux-Konsole.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau