Ankündigung

Einklappen
Keine Ankündigung bisher.

Dateien im Array ausschließen

Einklappen

Neue Werbung 2019

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

  • Dateien im Array ausschließen

    Hallo Leute,

    ich benutze folgenden Code für ein Array zwecks Hintergrundbildgenerierung aus einem Verzeichnis mit Bildern:

    $result = array_merge( glob( "../../uploads/*1500x*.jpg" ), glob( "../../uploads/*x1500.jpg" ) );

    In dem Verzeichnis sind sagen wir 100 Bilder mit diesem Namensmuster, z.B.

    alpha-1000x1500.jpg
    beta-1500x1000.jpg
    gamma-1500x1000.jpg
    delta-1000x1500.jpg
    epsilon-1500x1000.jpg
    ...

    Nun gefällt mir eine Grafik davon nicht so sehr für den Hintergrund oder vielleicht auch mehrere.

    Wie kann ich als Beispiel die Datei mit "delta" im Namen im obigen Array ausschließen oder kann glob so etwas nicht?


  • #2
    glob die dateien die du ausschließen willst und lass dir aus der zusammengeführten Menge und der geglobten Daten die Differenz geben.

    [man]array_diff[/man]
    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

    Kommentar


    • #3
      Prüfe mal ob es nicht sinnvoller ist deine obige Auswahl weiter eingrenzen. Schau dir mal das Flag GLOB_BRACE an, damit kannst du so etwas machen:
      PHP-Code:
      $result glob"../../uploads/{alpha,beta}*1500x*.{gif,jpg}" ,GLOB_BRACE); 
      Du sparst dir damit auch dein array_merge.
      PHP-Klassen auf github

      Kommentar


      • #4
        Zitat von tr0y Beitrag anzeigen
        glob die dateien die du ausschließen willst und lass dir aus der zusammengeführten Menge und der geglobten Daten die Differenz geben.

        [man]array_diff[/man]

        Also, ich habe das nun so geschrieben:

        $vorresult = array_merge( glob( "../../uploads/*1500x*.jpg" ), glob( "../../uploads/*x1500.jpg" ) );

        $result = array_diff( $vorresult, glob( "../../uploads/hund*.jpg" ) );

        1. Ist das korrekt so?

        2. Damit habe ich dann genau eine störende Datei entfernt. Wenn ich aber mehrere nicht im Array (Katze-1500x1000.jpg, Maus-1000x1500.jpg, ...) haben möchte, müsste ich jedes Mal eine glob-Zeile hinzusetzen.

        Das ist doch irgendwie dämlich gelöst oder?

        Kommentar


        • #5
          du kannst die menge auch in glob mit braces limitieren, das is aber generell erstmal schlechter lesbar ( auch wenns funktional performanter ist ).

          Wie genau du das Umsetzt hängt davon ab wie du das ganze limiteren willst und wieviele Dateien da wie ins spiel kommen. Grundsätzlich kann man dort auch mit Iteratoren arbeiten:
          - http://php.net/manual/de/class.globiterator.php
          - http://php.net/manual/en/class.callb...eriterator.php

          Und so das Filtern der Dateien nicht nur auf den Namen ( oder ein Namenspattern ) sondern auch auf Dateigröße, Mimetype und was sonst noch so als Filter-Credentials aufläuft filtern. Die POP-Equivalente dazu sind im übrigen [man]glob[/man], [man]fileinfo[/man] und [man]array_filter[/man].
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #6
            Okay, noch etwas vereinfacht:

            $vorresult = array( glob( "../../uploads/*1500*.jpg" ) );

            $result = array_diff( $vorresult, glob( "../../uploads/hund*.jpg" ) );

            Ist das korrekt so?

            Er nimmt damit alle Dateien mit einem 1500 im Namen auf, außer der Datei mit einem Hund im Namen, richtig?

            Kommentar


            • #7
              Frage nicht ob das korrekt so ist, probier es aus.
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar


              • #8
                Zitat von tr0y Beitrag anzeigen
                du kannst die menge auch in glob mit braces limitieren, das is aber generell erstmal schlechter lesbar ( auch wenns funktional performanter ist ).

                Wie genau du das Umsetzt hängt davon ab wie du das ganze limiteren willst und wieviele Dateien da wie ins spiel kommen. Grundsätzlich kann man dort auch mit Iteratoren arbeiten:
                - http://php.net/manual/de/class.globiterator.php
                - http://php.net/manual/en/class.callb...eriterator.php

                Und so das Filtern der Dateien nicht nur auf den Namen ( oder ein Namenspattern ) sondern auch auf Dateigröße, Mimetype und was sonst noch so als Filter-Credentials aufläuft filtern. Die POP-Equivalente dazu sind im übrigen [man]glob[/man], [man]fileinfo[/man] und [man]array_filter[/man].
                Ach, herrje, das geht über meinen Wissensstand weit hinaus.

                Wie gesagt, ich habe ca. über 300 Grafiken in einem Verzeichnis. 100 davon heißen am Ende "*-1500x1000.jpg" oder "*-1000x1500.jpg".

                Von diesen 100 soll nun eines für einen Zufallsgenerator gewählt werden. Dafür habe ich dann das array_merge mit "1500x" und "x1500".

                Das klappt alles soweit.

                Aber von diesen letzten 100 gibt es eben zwei, drei, die nicht so passend sind und nicht für den Generator gewählt, also ausgeschlossen werden sollen.

                Das ist das einzige kleine Problem ... und die Namen sind willkürlich, also auto-1500x1000.jpg oder dose-1000x1500.jpg.

                ... und ich muss eigtl nur diese zwei, drei ausschließen.

                Kommentar


                • #9
                  Zitat von xVEGAx Beitrag anzeigen
                  Okay, noch etwas vereinfacht:

                  $vorresult = array( glob( "../../uploads/*1500*.jpg" ) );

                  $result = array_diff( $vorresult, glob( "../../uploads/hund*.jpg" ) );

                  Ist das korrekt so?

                  Er nimmt damit alle Dateien mit einem 1500 im Namen auf, außer der Datei mit einem Hund im Namen, richtig?
                  Mist, das klappt schon einmal nicht. Weißer Hintergrund. :\

                  Kommentar


                  • #10
                    dann schau dir mit var_dump an was bei deinem geglobbe rauskommt und was array_diff draus macht.
                    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                    Kommentar


                    • #11
                      Zitat von tr0y Beitrag anzeigen
                      dann schau dir mit var_dump an was bei deinem geglobbe rauskommt und was array_diff draus macht.
                      Okay, so scheint es nun zu funktionieren:

                      $vorresult = glob( "../../uploads/*1500*.jpg" );
                      $result = array_diff( $vorresult, glob( "../../uploads/*karte*.jpg" ) );

                      Zumindest wird ein Bild wieder geladen. Ich musste das array vor dem glob entfernen.

                      Ob jetzt das eine Bild wirklich fehlt, konnte ich bei der Menge nicht feststellen, aber ich habe mal kurz 100mal refresht und es kam zumindest nicht an, wobei das natürlich keine Garantie ist. Ich vertraue jetzt einfach darauf.

                      Blöd wird es wohl nur, wenn ich noch weitere Dateien nicht im array haben möchte. Dann sieht es wohl so aus.

                      $vorresult = glob( "../../uploads/*1500*.jpg" );
                      $result = array_diff( $vorresult, glob( "../../uploads/*karte*.jpg" ), glob( "../../uploads/*hund*.jpg" ), glob( "../../uploads/*auto*.jpg" ) );

                      ... und ich weiß nicht einmal, ob das überhaupt valide ist.

                      Kommentar


                      • #12
                        Ich glaube, so geht es mit Ausschluss mehrerer Dateien, dank glob_brace.

                        $vorresult = glob( "../../uploads/*1500*.jpg" );
                        $result = array_diff( $vorresult, glob( "../../uploads/*{person,karte}*.jpg", GLOB_BRACE ) );

                        Müsste stimmen ...

                        Kommentar


                        • #13
                          Zeichenklassen für glob()

                          Anmerkung : Zeichenklassen für glob()

                          Auf GLOB_BRACE wurde ja schon hingewiesen. Weniger bekannt ist, da im PHP-Manual nur versteckt in den Beispielen zu finden, glob() auch mit Zeichenklassen arbeiten kann.
                          Beispiel:
                          PHP-Code:
                          $files glob('[ap-r]*.php');  //Alle php-Dateien deren Namen mit a,p,q oder r beginnen 
                          Die Zeichenklassen erlauben auch eine Negation (mit !), so das damit auch bestimmte Dateien ausgeschlossen werden können.

                          Beispiel:
                          PHP-Code:
                          $files glob('[!r]*.php'); 
                          liefert alle .php Dateien die nicht mit r beginnen.

                          In Verbindung mit GLOB_BRACE kann damit schon eine Menge gefiltert werden.
                          Auf ein Problem wurde auch schon hingewiesen, daß diese Konstrukte dann nicht immer leicht lesbar sind.

                          LG jspit
                          PHP-Klassen auf github

                          Kommentar

                          Lädt...
                          X