Ankündigung

Einklappen
Keine Ankündigung bisher.

Array nach Zahlen und Buchstaben sortieren

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

  • Array nach Zahlen und Buchstaben sortieren

    Hallo,
    ich lasse mit scandir() ein Verzeichnis auslesen, in dem nur Bilder in der Art IMG_1234.JPG liegen Die werden ganz prima sortiert.
    In Zukunft möchte ich vor den ursprünglichen Bildnamen das Hochlade-Datum einfügen, so: 2018-01-05-IMG_1234.JPG.
    Diese neu hochgeladenen Bilder sollen im Array vor denen ohne Datum stehen, das neueste immer ganz vorne.
    Jetzt werden sie immer hinten eingereiht, zwar das neueste auch als erstes, aber der ganze Block, der mit einer Zahl beginnt, hinten.

    Kann mir da bitte jemand helfen?

    Gruß, Hago


  • #2
    Da Zahlen und Buchstaben unterschiedlich sortiert werden, wenn um es die Reihenfolge geht, würde ich das mit glob() in 2 Schritten einlesen, nicht scandir..
    Block 1
    alle Bilder die ein Datum vorangestellt haben einlesen, darauf arsort($array) anwenden um neuestes Datum zuerst zu haben.

    Block 2
    alle Bilder die kein Datum haben und mit einem Buchstaben beginnen (imgXXX.jpg etc.) einlesen, da wendest du natsort($array) an.
    nun erst Block 1 ausgeben danach Block 2, oder die Arrays mit array_merge zu einem Array zusammenführen.
    Sicherlich kann man hier wohl auch anders vorgehen, diese Methode sollte aber, da das Verzeichnis eh gecached wird, eine schnelle Variante sein.

    Kommentar


    • #3
      Danke, das hört sich gut an, ich werde es ausprobieren.

      Kommentar


      • #4
        Hier mal der Code von mir dazu

        PHP-Code:
        <?php
        header
        ('Content-Type: text/html; charset=utf-8');

        $dir 'bilder';
        chdir$dir );

        echo 
        'Bilder im Verzeichnis => ' getcwd() . "<br><br>\n";

        $files_by_date glob("[0-9]*.jpg");           
        $files_by_name glob("[A-z]*.jpg");

        arsort($files_by_date);
        sort ($files_by_nameSORT_NATURAL SORT_FLAG_CASE);

        $all_files array_merge($files_by_date$files_by_name);

        $orderd_list "<ol>\n<li>" implode("\n<li>"$all_files) . "\n</ol>";

        echo 
        $orderd_list;

        Kommentar


        • #5
          Ich würde auch sagen, dass man um das getrennte Sortieren nicht herum kommt. Allerdings würde ich schon das ganze Verzeichnis in einem Rutsch machen.
          Das Trennen würde ich dann über die Array-Funktionen machen. Ob das performanter oder besser ist, weiß ich nicht, ich greife nur nicht gerne zweimal auf das Dateisystem zu, für eine Aufgabe, daher als Möglichkeit zu betrachten:
          PHP-Code:
          $aFiles array_map(
                  function (
          $filepath) { return basename($filepath); },
                  
          glob'./*.{jpg,JPG}'GLOB_BRACE )
              );

          $aBeginsWithLetter array_filter$aFiles, function ($filename) { return preg_match('/^img.+/ius'$filename); } );
          $aFiles array_diff$aFiles$aBeginsWithLetter );

          arsort$aFiles );
          rsort$aBeginsWithLetterSORT_NATURAL );

          $aFiles array_merge$aFiles$aBeginsWithLetter ); 
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche Tutorials

          Kommentar


          • #6
            Hallo,
            mit dem angepassten Code von protestfix hat die Sortiererei perfekt geklappt.

            Den Code von Arne Drews habe ich nicht vollständig verstanden, deshalb ist es mir auch nicht gelungen, ihn anzupassen.
            Ich verstehe zB. nicht, was das "ius" in "preg_match('/^img.+/ius', $filename);" bedeutet.

            Kommentar


            • #7
              Jetzt hat es doch auch mit dem Code von Arne Drews geklappt.
              Trotzdem verstehe ich nicht, was das "ius" in "preg_match('/^img.+/ius', $filename);" bedeutet.

              Kommentar


              • #8
                ..."ius" in "preg_match('/^img.+/ius', $filename);"

                Ich hab's gefunden. War viel simpler als ich annahm.
                Vielen Dank euch.

                Gruß, Hago

                Kommentar


                • #9
                  Es geht schon in einem Rutsch mit usort wenn die Fallunterscheidungen in die Sortierfunktion verlagert werden.
                  Für den allgemeineren Fall sollte auch geprüft werden ob am Anfang wirklich ein Datum steht und nicht etwas so was wie 123456.jpg.
                  Mal als Ansatz (Hab ich jetzt nicht ausgetestet):
                  PHP-Code:
                  $images glob('*.{jpg,JPG}'GLOB_BRACE);

                  usort($images, function($a,$b){
                    
                  $aDate date_create(substr($a,0,10));
                    
                  $bDate date_create(substr($b,0,10));
                    if(
                  $aDate OR $bDate) return $aDate $bDate;
                    return 
                  strnatcmp($a$b);
                  }); 
                  PHP-Klassen auf github

                  Kommentar


                  • #10
                    ich habe das ausprobiert. - Es klappt.
                    Die Sortierung ist allerdings nicht, wie ich sie brauche.

                    So wird sortiert:
                    2018...
                    2017...
                    2016...
                    IMG_0001
                    IMG_0002
                    IMG_0003

                    So brauche ich es (die jüngsten Bilder immer oben):
                    2018...
                    2017...
                    2016...
                    IMG_0003
                    IMG_0002
                    IMG_0001

                    Ich habe nicht rausgefunden, ob und wenn ja, wie ich die Sortierung diesbezüglich beeinflussen kann.

                    Kommentar


                    • #11
                      Die jüngsten Bilder welche ein Datum vornweg haben sind doch schon immer oben. Wenn du deine Bilder ohne Datum so wie gezeigt haben möchtest, kannst du diese auch in absteigener Sortierung ausgeben. Dazu ist in der Filterfunktion nur ein Minus notwendig:
                      PHP-Code:
                      // :
                      return -strnatcmp($a$b); 
                      Hast du jedoch andere Namen als IMG.., dann werden diese auch absteigend sortiert. Wenn diese Lösung für deinen Fall auch nicht passt solltest du definieren, wie du anhand des Dateinamens feststellen willst welches Bild das jeweils neuere ist. Üblicher Weise wird dafür das Dateidatum benutzt und nicht irgendwelche eigene Dateinamenskonventionen.
                      PHP-Klassen auf github

                      Kommentar


                      • #12
                        Danke, das Minus funktioniert perfekt.
                        Die ohne Datum sind die älteren Bilder (alle IMG), alle neuen Bilder werden das Datum haben.

                        Kommentar

                        Lädt...
                        X