Ankündigung

Einklappen
Keine Ankündigung bisher.

Ordner auslesen und während des auslesen sortieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ordner auslesen und während des auslesen sortieren

    Hallöchen, ich weiss nicht ob ich in diesem Forum richtig bin.. is ja verwirrend..

    Ich lese einen Ordner mit OPENDIR/READDIR aus..
    kann demnach alles wunderbar ausgeben..

    aktuell sortiere ich die inhalte nachdem ich den ganzen ordnerinhalt in ein array geschrieben habe, mit der funktion array_multi_sort().. geht wunderbar, so wie ich es mir gewünscht habe..

    ABER:
    So muss ich erst den ganzen Ordner auslesen, was u.U. bei grossen Ordnern zu Probleme mit der Ladezeit führen kann.

    Gibt es eine Möglichkeit schon während (oder wenigstens zeitnah ^^) des einlesens des ordners zu sortieren?
    Halt ohne alles in ein Array zu schreiben..



    Ich will Bilder aus einem Ordner auslesen, aber bei der ausgabe seitenzahlen hinzufügen, was bei einem Ordner mit über 200 bildern (sagen wir mal so) sehr lange dauert..


    Kann mir hier jemand auf die sprünge mit einer funktion oder gar nen kleinen codeteil helfen?


  • #2
    Also die einzige Möglichkeit, die ich sehe, ist halt immer, wenn du ein neues File einliest, dieses gleich an der korrekten Stelle im Array einzufügen (mussu einen Algorithmus verwenden) bzw am Ende einzufügen und dann mit ner PHP-Funktion zu sortieren. Dummerweise dauert das ständige Ausführen des Algorithmus bzw der Sortierfunktion definitiv länger, wie wenn du alles einliest und dann am Schluss sortierst.

    Alternativ könntest du eine Implementierung als Baum verwenden, aber auch da musst du jeweils alle Files einlesen.

    Ich verstehe dein Problem aber nicht ganz. Das Filelisting eines Ordners ist doch (wenn auch begrenzt) bereits alphabetisch geordnet. Oder willst du nach anderen Kriterien sortieren?

    Kommentar


    • #3
      ja das isses ja.. nach name sortieren solls ja nicht..
      ehr nach datum, wann wurde hochgeladen..
      also die neuesten dateien sollen oben stehen.

      die möglichkeit, das erstelldatum als key zu nutzen kam mir auch in den sinn, nur wäre dort das problem, dass es ggf. 2 files gibt die exact zur selben zeit hochgeladen wurden.. ok is ehr selten, KANN aber vorkommen

      demnach habe ich die option im script drin, nach DATUM, NAME, GRÖSSE, BREITE und HÖHE zu sortieren..
      will noch eine option einbauen, wo man per dropdown auswählen wonach zu sortieren ist, aber das ist 2. rangig.. primär sollte die sortierung ansich im vordergrund stehen, damit diese reibungslos läuft..

      und genau weil es primär nach datum sortieren soll, hab ich so meine probleme damit



      aber ok, wenn du meinst es ist wohl letztenendes besser im nachhinein zu sortieren, bleibt mir vorab keine andere möglichkeit..



      im netz hab ich keine funktion gefunden die mir das erleichtert ^^
      hatte erst gehofft scandir hilft mir.. sortiert aber auch nur nach name..

      Kommentar


      • #4
        Kenne leider auch keine PHP-Funktion, bei der man angeben kann, wonach ein Directory Listing sortiert werden soll.

        Da ich keine Ahnung habe, welchen Algorithmus array_multisort() verwendet, ist meine Aussage, dass eine einmalige Sortierung schneller ist, nur geraten. Aber Algorithmen wie Mergesort (der im allgemeinen Fall wohl als optimal betrachtet werden kann mit einer Komplexität von n * log(n) Schritten) werden nicht schneller, wenn man sie bereits auf Teile des zu sortierenden Arrays anwendet. Aber wenn du einen eigenen Algorithmus schreibst, der berücksichtigt, dass nur das neueste Element an der richtigen Position eingefügt werden muss und mit Anfangs- und Enddaten Abschätzungen machst, könnte es durchaus schneller sein.
        Zur Resourcen-Ausnutzung wage ich keine Aussage zu machen, da das wirklich nurnoch komplett geraten wäre.

        Kommentar


        • #5
          Schonmal versucht 10 von 30 Leute ihrem Alter - entsprechend der Gesamtheit - aufzustellen, ohne die restlichen 20 nach ihrem Alter zu fragen? Du MUSST alle Eintraege einlesen. Aber du musst das ganze nicht jedes mal neu machen, dafuer gibts Caches, die du dir ganz billig selber bauen kannst. Entweder ueber die Session, oder eine Datei. Erstell einfach einen cache-Ordner in deinem Projekt und schreib das Ergebnis deiner Sortierung aller Eintraege einfach serialize()d (siehe Handbuch) direkt mit file_put_contents() in den cache-Ordner. Natuerlich musst du die Datei irgendwann wieder verwerfen, sonst werden Aktualisierungen im realen Dateisystem ja nie beruecksichtigt. Wenn der Bilderordner den du auslesen willst, aber ueber dein Administrationstool administriert wird, kannst du dort ja an geeigneter Stelle das Loeschen der Cache-Datei veranlassen.

          PS: 200 Bilder in einem Ordner gehen eigentlich noch, statt readdir wuerde ich dir glob() empfehlen, wenn du Glueck hast gibts dafuer sogar einen Mode-Flag, der die Sortierung fuer dich uebernimmt. Ab mehreren hundert Bildern wuerde ich dir empfehlen, eine ab/cd/ Struktur im Hex-Format anzulegen und die Bilddateien als MD5-Hashsumme abzuspeichern. So vermeidest du auch das doppelte Hochladen der selben Datei.
          "Mein Name ist Lohse, ich kaufe hier ein."

          Kommentar


          • #6
            Zitat von Chriz Beitrag anzeigen
            Schonmal versucht 10 von 30 Leute ihrem Alter - entsprechend der Gesamtheit - aufzustellen, ohne die restlichen 20 nach ihrem Alter zu fragen?
            Gut gekontert

            Den Rest lass ich mir mal durch den Kopf gehen..

            vielen dank dir

            Kommentar


            • #7
              Oder du legst ein Abbild des Ordners in einer Datenbank an. Dann wird dir das Auslesen und Sortieren deutlich erleichtert.
              Du musst dann nur den Ordner bei Änderungen mit der Datenbank abgleichen.
              Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

              Kommentar

              Lädt...
              X