AirMax: Regulärer Ausdruck

0 72

Regulärer Ausdruck

  1. 0
    1. 0
      1. 0
        1. 0
          1. 0

            Webserver MacOsX aktivieren

  2. 1
    1. 0
      1. 0

        Warum auch ein völlig anderes Thema ein Doppelposting sein kann.

        1. 0
          1. 0
          2. 1

            $tänze = array_count_values($hochzeiten);

            1. -1
              1. 3
            2. 0
    2. 0
      1. 0
        1. 0
          1. 0
            1. 0
              1. 0
                1. 0
                  1. 0
                    1. 0
                      1. 0
                        1. 0
                          1. 0
                            1. 0
                              1. 0
                                1. 0
                                  1. 0
                                    1. 0
                                    2. 0
                                      1. 0
                                        1. 0
                                          1. 0
                                            1. 0

                                              zufälligen Eintrag aus Array wählen

                                    3. 0
                                      1. 0

                                        ordentliches Einrücken von Code

                                    4. 0

                                      Header-Informationen

                                      1. 0
                                      2. 0
                                        1. 0
                                          1. 0
                                            1. 0
                                              1. 0
                                                1. 0
                                                  1. 0
                                                    1. 0
                                                      1. 0
                                                        1. 0
                                                          1. 0
                                                            1. 0
                                                              1. 0
                                                                1. 0
                                                                  1. 0
                                                                    1. 0
                                                                      1. 0
                                            2. 0
                                              1. 0
                                                1. 0
                                                  1. 0
                                                    1. 0
                                                      1. 0
                                                        1. 0
                                                2. 0
    3. 0
      1. 0
        1. 0
          1. 0
            1. 0
              1. 0

Hallo zusammen

möchte alle Einträge im String $array auf die Endung ".jpg" hin durchsuchen und in $ausschluss speichern.

  
preg_match_all("/(\.jpg$)/"),$array,$ausschluss);  
var_dump($ausschluss);

Aber $ausschluss ist nach der suche "NULL". Wo in meinem Muster ist denn der Fehler?

Danke & Gruss
AirMax

  1. preg_match_all("/(.jpg$)/"),$array,$ausschluss);
    var_dump($ausschluss);

    
    > Wo in meinem Muster ist denn der Fehler?  
      
    Konzentriere dich auf das, was dem Muster folgt.  
      
    mfg Beat
    
    -- 
    
    ><o(((°>           ><o(((°>  
    
       <°)))o><                     ><o(((°>o  
    Der Valigator leibt diese Fische
    
    1. Konzentriere dich auf das, was dem Muster folgt.

      Besser?

        
      foreach($array as $dateien);  
      preg_match_all("/(\.jpg$)/"),$dateien,$ausschluss);  
      var_dump($ausschluss);
      

      Gruss

      1. Hallo,

        Konzentriere dich auf das, was dem Muster folgt.
        Besser?

        foreach($array as $dateien);

        preg_match_all("/(.jpg$)/"),$dateien,$ausschluss);
        var_dump($ausschluss);

          
        nö, überhaupt nicht. Immer noch derselbe Syntaxfehler. Liest du die Fehlermeldungen gar nicht, die der PHP-Parser um sich wirft? Oder lässt du sie gar nicht erst anzeigen? - Dann würde ein Script mit dieser Anweisung allerdings keinen Output erzeugen, sondern nur eine leere Seite.  
          
        Und wenn der Syntaxfehler nicht wäre, würde ich immer noch die Sinnhaftigkeit der leeren foreach-Schleife anzweifeln.  
          
        Ciao,  
         Martin  
        
        -- 
        Wieso heißen die Dinger eigentlich Anrufbeantworter? Eigentlich sind es doch nur Anrufanhörer.  
        
        
        1. Liest du die Fehlermeldungen gar nicht, die der PHP-Parser um sich wirft? Oder lässt du sie gar nicht erst anzeigen?

          Habe noch nie eine Fehlermeldung vom Parser bekommen. Offenbar sind die beim hoster ausgeschalten. Und lokal kann ich es nicht test, weil ich nicht weiss, wie man PHP (MacOSX) aktiviert.

          1. Und lokal kann ich es nicht test, weil ich nicht weiss, wie man PHP (MacOSX) aktiviert.

            Das ist einfach: um den in MacOsX enthaltenen Webserver zu aktivieren, gehe zu Systemeinstellungen/Sharing/Dienste und schalte "Personal Web Sharing" ein.

            Der Ordner für die Webseite des Computers (http://127.0.0.1/) ist (MacintoshHD)/Library/WebServer/Documents/, der Ordner für deine persönliche Seite (http://127.0.0.1/~UserName/) ist (DeinHomeVerzeichnis)/Web-Sites/.

            Der Apache hat in der Regel PHP schon installiert.

            Grüße, patrick

  2. möchte alle Einträge im String $array auf die Endung ".jpg" hin durchsuchen und in $ausschluss speichern.

    Ein String der $array heisst? Wohlkaum - wenn du unsinnige Doppelpostings künftig unterlässt, wird es einfacher dir zu helfen.

    Aber $ausschluss ist nach der suche "NULL". Wo in meinem Muster ist denn der Fehler?

    Dein Fehler ist der Ansatz.

    Lass mich dein Vorhaben erraten:

    Du hast offensichtlich ein Array mit Dateinamen.
    Du willst alles Rausschmeißen, was nicht die Endung .jpg hat (oder umgekehrt).

    Nutze array_filter() und prüfe ob der in pathinfo() (extension) enthaltene Wert in_array() (du willst vermutlich .jpg, .jpeg und ggf .jpe finden) deiner erlaubten (oder verbotenen) Dateiendungen ist. zusätzlich solltest du dann noch mit getimagesize() den MIME-Type prüfen, ob dieser wirklich image/jpeg ist - die Endung selbst ist eigentlich nicht viel Wert.

    1. Hi Suit

      wenn du unsinnige Doppelpostings künftig unterlässt, wird es einfacher dir zu helfen.

      Ich finde, es ist kein Doppelposting. Mir geht's hierbei um die "Sache" und nicht um ein "Projekt". Das sind in meinen Augen 2 unterschiedliche Paar Schuhe. Wenn Du es anders siehst: "Entschuldigung" für's Doppelposting.

      "Some people, when confronted with a problem, think 'I know, I’ll use regular expressions.' Now they have two problems."

      Allerdings!

      Du hast offensichtlich ein Array mit Dateinamen.
      Du willst alles Rausschmeißen, was nicht die Endung .jpg hat (oder umgekehrt).

      In diesem Fall will ich alles rausschmeissen, was die Endung ".jpg" hat.

      Nutze array_filter() und prüfe ob der in pathinfo() (extension) enthaltene Wert in_array() (du willst vermutlich .jpg, .jpeg und ggf .jpe finden) deiner erlaubten (oder verbotenen) Dateiendungen ist. zusätzlich solltest du dann noch mit getimagesize() den MIME-Type prüfen, ob dieser wirklich image/jpeg ist - die Endung selbst ist eigentlich nicht viel Wert.

      Werde mir mal die links anschauen.

      Danke & Gruss

      1. Ich finde, es ist kein Doppelposting. Mir geht's hierbei um die "Sache" und nicht um ein "Projekt". Das sind in meinen Augen 2 unterschiedliche Paar Schuhe. Wenn Du es anders siehst: "Entschuldigung" für's Doppelposting.

        Ein Doppelposting ist nicht unbedingt ein Duplikat eines Themas - auch ein Folgeproblem zählt dazu. Du teilst die Aufmerksamkeit und unterschlägst wichtige Informationen.

        Damit erschwerst du Helfenden, dir zu helfen und machst es dir selbst unnötig schwer, da du ggf. Beschreibungen nachreichen musst, die im vorhergehenden Thread schon gegeben waren. Bzw. du gehst von Dingen aus, die für dich selbstverständlich sind, ein neu hinzukommender Poster aber nicht wissen kann.

        So wie in diesem Thread - hier ist es für mich (der deinen anderen Thread verfolgt hat) offensichtlich, dass du keinen String sondern ein Array hast (das ist ein gewaltiger Unterschied - da preg_match_all für $subject lt. Doku eindeutig einen String und kein Array erwartet) - Beat hast du damit aber auf eine falsche Fährte gelockt.

        Du kannst zu diesem Zweck problemlos innerhalb eines Threads das Thema (oder den Themenbereich) welchseln, wenn sich ein neues Folgeproblem auftut - so wie ich das jetzt tue.

        1. Ich weiss, was Du damit sagen willst. Aber mir ist es eben wichtig die Sachen auch unabhängig vom Kontext zu verstehen. Ich will schliesslich nur das auf ein Projekt anwenden, was ich auch nachvollziehen kann und begreife. Deshalb dachte ich, es ist so besser.

          1. Ich weiss, was Du damit sagen willst. Aber mir ist es eben wichtig die Sachen auch unabhängig vom Kontext zu verstehen.

            Dann musst du aber auch sämtliche relevanten Informationen liefern und nicht _essentielle_ Informationen unterschlagen (wie erwähnt, ein String ist kein Array).

          2. Hi,

            Ich weiss, was Du damit sagen willst. Aber mir ist es eben wichtig die Sachen auch unabhängig vom Kontext zu verstehen.

            Dann solltest du dich aber vielleicht auch erst mal mit einem Thema etwas intensiver beschäftigen.
            Im Moment scheinst du beinahe wöchentlich zur "nächsten Baustelle" zu springen, ohne die vorherige überhaupt fertiggestellt zu haben, d.h. das im dortigen Rahmen relevante auch wirklich durchdrungen und über einen von der konkreten Aufgabe vorgegebenen "Tellerrand" hinaus verstanden zu haben.

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
            1. Im Moment scheinst du beinahe wöchentlich zur "nächsten Baustelle" zu springen, ohne die vorherige überhaupt fertiggestellt zu haben, d.h. das im dortigen Rahmen relevante auch wirklich durchdrungen und über einen von der konkreten Aufgabe vorgegebenen "Tellerrand" hinaus verstanden zu haben.

              MfG ChrisB

              Hi ChrisB

              Du hast vollkommen recht! Ich stelle mir für gewöhnlich eine Aufgabe und suche nach einer Lösung. Wenn ich dann eine Lösung gefunden habe hinterfrage ich sie erneut und überlege mir, ob man es nicht auch vielleicht abders, einfacher oder eleganter lösen könnte. Doch leider stosse ich immer wieder an meine Grenzen und komme vor lauter Ideen gar nicht dazu mir das notwendige Wissen anzueignen. Denn oftmals sind die Dinge, die auf den ersten Blick sehr simpel aussehen diejenigen, die es in sich haben und die einen langen Entstehungsweg hinter sich haben. Ich glaube, man kann nicht Gestalter und Informatiker in einem sein. Dafür sind die Aufgabenfelder zu komplex. Viel wichtiger ist, dass man über ein gewisses Grundverständnis für das andere Territorium mitbringt. Und daran arbeite ich.

              Gruss

              1. Hallo,

                Ich stelle mir für gewöhnlich eine Aufgabe und suche nach einer Lösung.

                ja, das geht mir auch so. Ich gebe mich dann aber erst zufrieden, wenn ich die Lösung so weit verstanden habe, dass sie mir innerhalb der verfügbaren Randbedingungen so logisch erscheint, dass ich sie mir auch selbst hätte herleiten können; wenn ich die Lösung so kapiert habe, dass ich sie auch auf einen anderen Kontext anwenden kann.

                Wenn ich dann eine Lösung gefunden habe hinterfrage ich sie erneut und überlege mir, ob man es nicht auch vielleicht abders, einfacher oder eleganter lösen könnte.

                Das auch - diese Frage stelle ich mir aber erst, wenn ich aus der Detailtiefe des obigen Schritts wieder auftauche.

                Doch leider stosse ich immer wieder an meine Grenzen und komme vor lauter Ideen gar nicht dazu mir das notwendige Wissen anzueignen.

                Und das ist falsch und gefährlich, weil es dir nicht hilft!
                Nimm einen Schreibblock, mach ein Brainstorming, notiere und skizziere deine Ideen, dass dir keine verlorengeht, wenn sich das Projekt länger hinzieht als erwartet.
                Und dann spring nicht über die Einzelprobleme hinweg, sondern versuche sie zu bewältigen. Sicher, das heißt auch immer wieder: Lernen! Klar, man kann Teilbereiche für sich ausschließen (muss man bei der Fülle an Themen sogar), mit denen man sich nicht im Detail befassen möchte, sondern nur gerade soviel wie nötig.
                Aber du machst den Eindruck eines Konditorlehrlings, der nur reihum an den Leckereien nascht, anstatt systematisch und konsequent zu lernen.

                Ich glaube, man kann nicht Gestalter und Informatiker in einem sein.

                Ich glaube, man kann. Das ist aber nicht der Regelfall. Meistens liegen die natürlichen Stärken doch deutlich im einen oder anderen Feld, und dann ist es hart, sich den anderen Bereich anzueignen, der einem vom Talent her nicht so liegt.

                Viel wichtiger ist, dass man über ein gewisses Grundverständnis für das andere Territorium mitbringt. Und daran arbeite ich.

                Wichtig ist IMHO, dass man ein Verständnis dafür entwickelt, wie die zahllosen Teildisziplinen zusammenhängen, auch wenn man sie nicht alle beherrscht.
                Wenn man Autofahren will, muss man nicht genau wissen, wie Motor, Kupplung und Getriebe exakt konstruiert sind. Es hilft aber, wenn man ungefähr verstanden hat, wie diese Baugruppen miteinander funktionieren - dann wird einem auch die Handhabung logisch vorkommen, während es im anderen Fall ein stures Auswendiglernen von Bewegungsabläufen ist.

                Ciao,
                 Martin

                --
                Man soll den Tag nicht vor dem Abend loben.
                Und den Mann nicht vor dem Morgen.
                  (alte Volksweisheit)
            2. "$tänze = array_count_values($hochzeiten);"

              Das hast Du aber schön geschrieben ;)

    2. Hi Suit,

      hab mir Deine links mal durchgelesen. Im Grunde geht es darum, wie Du schon richtig sagtest, einen Array zu durchsuchen. Aber wenn ich mir die Dokumentation zu "in_array()" durchlese, scheint es, als könne man nur Elemente im Array suchen die genau dem Wortlaut der $needle-Variable entsprechen:

      $needle = ".svg";  
        
      if (in_array($needle,$array) {  
          echo "'.svg' ist enthalten";  
      }  
      
      

      Aber ich kenne ja nicht genau den Wortlaut der Array-Elemente. Ich weiss nur, dass ich Elemente suche, die mit .svg enden.

      Weisst, was ich meine?

      Gruss

      1. Aber ich kenne ja nicht genau den Wortlaut der Array-Elemente. Ich weiss nur, dass ich Elemente suche, die mit .svg enden.

        Weisst, was ich meine?

        Darum hab' ich dich auch auf die Existenz von path_info() hingewiesen.

        1. path_info()

          pathinfo()

          1. Sei mir nicht böse, Suit, aber ich sitze seit zwei Stunden vor Deinem Kommentar, habe den Satz "Nutze array_filter() und prüfe ob der in pathinfo() (extension) enthaltene Wert in_array() (du willst vermutlich .jpg, .jpeg und ggf .jpe finden) deiner erlaubten (oder verbotenen) Dateiendungen ist." bestimmt 20x gelesen (inkl. der dazugehörigen Dokumentationen) und habe bis jetzt nicht verstanden, wie der Ablauf ist. Ich kappier's einfach nicht :-(

            Ich verstehe einfach nicht, wie ich meinen array mit den Dateinamen mit der erlaubten Dateiendungen abgleichen soll.
            Also nochmal: Im array ist alles drin, was im Verzeichnis liegt: alle möglichen Dateien. Davon will ich entweder Dateien mit bestimmter Endung (z.B. *mov, *svg) oder ganz konkrete Elemente aus dem array rausschmeissen.
            Wenn ich "pathinfo() (extension)" anwende, bekomme ich einen array mit allen Dateiendungen im Verzeichnis. Das sieht wahrscheinlich so aus:

            array
            (
                [0] => jpg
                [1] => svg
                [2] => mov
                [3] => php
            )

            So! jetzt prüfe ich, ob die Inhalte meines array mit den Dateien (den ich mir überigens mit "readdir" bla bla generiere und nicht mit "pathinfo() PATHINFO_BASENAME" - "pathinfo" scheint mir aber die viel simplere Variante zu sein) mit den Inhalten des Array $dateiendungen übereinstimmt. Tut es aber nicht, denn "index.php" ist etwas anderes als "php".

            Ich glaube, ich habe einen riesigen Denkfehler.

            1. Ich glaube, ich habe einen riesigen Denkfehler.

              Ja :)

              Dein Array welches du mit readdir erhälst übergibst du an filter_array()

              filter_array() ruft als callback-Funktion eine Funktion auf, nennen wir sie "is_valid_extension".

              function is_valid_extension($str) {
                // prüfe, ob der in pathinfo (PATHINFO_EXTENSION) einhaltene Wert (BASENAME interessiert dich nicht, du willst ja nur die Extension prüfen) in deinem Konfigurationsarray mit den Erlaubten Extensions enthalten ist.
                // wenn ja: return true, ansonsten return false
              }

              1. function is_valid_extension($str) {
                  // prüfe, ob der in pathinfo (PATHINFO_EXTENSION) einhaltene Wert (BASENAME interessiert dich nicht, du willst ja nur die Extension prüfen) in deinem Konfigurationsarray mit den Erlaubten Extensions enthalten ist.
                  // wenn ja: return true, ansonsten return false
                }

                function is_valid_extension($erlaubt, $extensions) {
                    if ($erlaubt = $extensions) {
                        return "true";
                }
                    else {
                        return "false";
                }
                is_valid_extension("jpg", pathinfo(".",PATHINFO_EXTENSION));

                So in etwa? Ich habe immer Mühe mit den Klammern und Anführungszeichen...
                (Jetzt habe ich mir aber einen abgebrochen. Und ich könnte wetten, es ist immer noch nicht richtig)

                1. Das war nix. Nochmal:

                  $erlaubt = "jpg";

                  function is_valid_extension($array) {
                      if (in_array($erlaubt, $array) {
                          return "true";
                  }
                      else {
                          return "false";
                  }

                  echo array_filter($array, "is_valid_extension")

                  Oder so ähnlich.

                  1. Oder so ähnlich.

                    Ja, so ähnlich - nur dass die callback-Funktion von array_filter jeden wert des Arrays einzeln durchgereicht bekommt :)

                    ergo musst du prüfen, ob die Extension des durchgereichten Werts in den erlaubten Werten enthalten ist.

                    Aktuell prüfst du, ob der erlaubte Wert (ein string) in einem array (welches eigentlich ein String ist) enthalten ist.

                    Ein paar debug-Ausgaben wären nicht verkehrt.

                    1. Aktuell prüfst du, ob der erlaubte Wert (ein string) in einem array (welches eigentlich ein String ist) enthalten ist.

                      Aber um das geht es ja. Der erlaubte Wert ist "jpg". Vertausche ich $needle mit $haystack etwa?

                      Ein paar debug-Ausgaben wären nicht verkehrt.

                      Ja, ich weiss. Aber ich muss erst mal das Grundgerüst auf die Reihe bekommen

                      1. Aktuell prüfst du, ob der erlaubte Wert (ein string) in einem array (welches eigentlich ein String ist) enthalten ist.
                        Aber um das geht es ja. Der erlaubte Wert ist "jpg". Vertausche ich $needle mit $haystack etwa?

                        ja - du sollst prüfen, ob in der aktuellen Wert (die Extension, des aktuellen Arrayeintrags, der an die callbackfunktion übergeben wurden) in deinem array erlaubter extensions enthaöten ist.

                        Ein paar debug-Ausgaben wären nicht verkehrt.
                        Ja, ich weiss. Aber ich muss erst mal das Grundgerüst auf die Reihe bekommen

                        Genau dafür sind Kontrollaufgaben aber hilfreich :)

                        $meinarray  
                        (  
                            [0] => 'foo.jpg'  
                            [1] => 'bar.txt'  
                            [2] => 'baz.jpg'  
                        )  
                          
                        array_filter($meinarray, 'callbackfunktion');
                        

                        führt 3x die callbackfunktion auf

                        sieht also etwa so aus:

                          
                        callbackfunktion('foo.jpg');  
                        callbackfunktion('bar.txt');  
                        callbackfunktion('baz.jpg');  
                          
                        function callbackfunktion($foo) {  
                          if ($foo == 'foo.jpg') {  
                            return true;  
                          } else {  
                            return false;  
                          }  
                        }  
                          
                        ergebnis:  
                          
                        $meinarray  
                        (  
                            [0] => 'foo.jpg'  
                        )
                        
                        1. ja - du sollst prüfen, ob in der aktuellen Wert (die Extension, des aktuellen Arrayeintrags, der an die callbackfunktion übergeben wurden) in deinem array erlaubter extensions enthaöten ist.

                          Ich hab $needle und $haystack verwechselt, weil ich dachte, der zu durchsuchende "array" ist der, der an die funktion geschickt wird. Dabei ist der zu durchsuchende array ja der jenige, der die mögliches extensions definiert - in meine Fall ja kein array sondern ein string ... so doof!

                          Genau dafür sind Kontrollaufgaben aber hilfreich :)

                          hab grad kein PHP bei mir ;)

                          $meinarray

                          (
                              [0] => 'foo.jpg'
                              [1] => 'bar.txt'
                              [2] => 'baz.jpg'
                          )

                          array_filter($meinarray, 'callbackfunktion');

                          
                          > führt 3x die callbackfunktion auf  
                          >   
                          > sieht also etwa so aus:  
                          > ~~~php
                            
                          
                          > callbackfunktion('foo.jpg');  
                          > callbackfunktion('bar.txt');  
                          > callbackfunktion('baz.jpg');  
                          >   
                          > function callbackfunktion($foo) {  
                          >   if ($foo == 'foo.jpg') {  
                          >     return true;  
                          >   } else {  
                          >     return false;  
                          >   }  
                          > }  
                          >   
                          > ergebnis:  
                          >   
                          > $meinarray  
                          > (  
                          >     [0] => 'foo.jpg'  
                          > )
                          
                          

                          Danke für Deine Hilfe!

                          Gruss

                          1. Hi Suit

                            Habe mir noch mal die Sache durch den Kopf gehen lassen und habe jetzt die Lösung. Und sie funktioniert sogar.

                              
                            //Das muss ich noch mit "readdir" anpassen.  
                            $array = array('foo.jpg','bar.txt','baz.tif');  
                              
                            function callback($foo) {  
                              $info = pathinfo($foo);  
                              if (strtolower($info['extension']) == 'jpg') {  
                                return true;  
                              } else {  
                                return false;  
                              }  
                            }  
                            print_r (array_filter($array, 'callback'));  
                            
                            

                            Gruss

                            1. Habe mir noch mal die Sache durch den Kopf gehen lassen und habe jetzt die Lösung. Und sie funktioniert sogar.

                              if (strtolower($info['extension']) == 'jpg') {

                              Jep - sieht gut aus.

                              Aber wie gesagt - ein jpeg kann auch jpe oder jpeg als Endung haben (darum der Hinweis mit in_array). Zudem kann etwas, was .jpg am Schluss stehen haben und gar kein JPEG sein - darum der Hinweis mit getimagesize und dem MIME-Type.

                              Das solltest du zusätzlich noch einbauen.

                              1. Das solltest du zusätzlich noch einbauen.

                                Ja, ich versuch's. Melde mich dann wieder ;)

                                Gruss

                                1. So, da bin ich wieder und hab's gepackt:

                                    
                                  $array = array('foo.jpg','bar.txt','baz.tif','jpg','blub.jpeg','bla.jpe');  
                                    
                                  function callback($foo) {  
                                    
                                  $stringinfo = pathinfo($foo);  
                                  $bildinfo = getimagesize($foo);  
                                  $extensions = array('jpg','jpeg','jpe');  
                                    
                                    if (!in_array(strtolower($stringinfo['extension']), $extensions)) {  
                                    
                                      return false;  
                                  }  
                                    elseif (($bildinfo[mime]) == 'image/jpeg') {  
                                    
                                      return true;  
                                  }  
                                  }  
                                  $auswahl = (array_filter($array, 'callback'));  
                                    
                                  print_r ($auswahl);
                                  

                                  Gruss

                                  1. $stringinfo = pathinfo($foo);
                                    $bildinfo = getimagesize($foo);

                                    Und das funktioniert? solange die Bilder im entsprechenden Verzeichnis liegen ja, aber in anderen fällen stimmt der Pfad nicht :)

                                    $extensions = array('jpg','jpeg','jpe');

                                    hier könntest du noch einen kommaspearierten String draus machen und das array mittels explode() und trim bilden - dann ist es einfacher wartbar (auch für normale Menschen). Zudem würde ich die Variable besser beschreiben "allowed_extensions" oder "valid_extensions" damit man sofort erkennt, worum es sich handelt.

                                    $valid_extensions = 'txt,doc, xml';

                                    if (!in_array(strtolower($stringinfo['extension']), $extensions)) {

                                    die Bedingung innerhalb eines if kennt auch logische Operatoren - kein grund für den else-if-KRam

                                    return false;
                                    }
                                      elseif (($bildinfo[mime]) == 'image/jpeg') {

                                    return true;
                                    }

                                    wenn das elseif nicht zutrifft, hat deine funktion keinen Rückgabewert. Da die Callback-Funktion nur "true" durchlässt und "nicht gesetzt" != true ist, stimmts trotzdem - der form halber würde ich aber dediziert immer true oder false zurückgeben.

                                    1. $stringinfo = pathinfo($foo);
                                      $bildinfo = getimagesize($foo);
                                      Und das funktioniert? solange die Bilder im entsprechenden Verzeichnis liegen ja, aber in anderen fällen stimmt der Pfad nicht :)

                                      Möchte diese Funktion unter dem Namen "teaserrandom.php" im Bilderordner ablegen. Und jetzt sind wir wieder bei meinem alten thread: Ich möchte nämlich dem nun erhaltenen Bilderauswahl-Array neue folrtlaufende Schlüssel zuteilen (0 bis X) und dann random(en). Der Zufallswert wird dann im Cookie mit dem Pfad /media/ gespeichert und betrifft dann nur noch dieses Verzeichnis (Danke an Edgar für den Tipp).

                                      $extensions = array('jpg','jpeg','jpe');
                                      hier könntest du noch einen kommaspearierten String draus machen und das array mittels explode() und trim bilden - dann ist es einfacher wartbar (auch für normale Menschen). Zudem würde ich die Variable besser beschreiben "allowed_extensions" oder "valid_extensions" damit man sofort erkennt, worum es sich handelt.

                                      Ja, dran schleifen kann ich immer noch. Am besten noch vergolden :)

                                      der form halber würde ich aber dediziert immer true oder false zurückgeben.

                                      Stimmt, muss noch ein else { return false; }; ranhängen.

                                      Gruss

                                    2. $stringinfo = pathinfo($foo);
                                      $bildinfo = getimagesize($foo);
                                      Und das funktioniert? solange die Bilder im entsprechenden Verzeichnis liegen ja, aber in anderen fällen stimmt der Pfad nicht :)

                                      Ich möchte diese "teaserrandom.php" im Bilderordner ablegen. Und nun sind wir wieder bei meinem alten thread: Ich möchte den Einträgen im nun erhaltenen "jpeg/jpg/jpe*image/jpeg-Bilderauswahl"-Array neue Schlüssel zuweisen (0 bis X) und dann random(en). Den Wert speichere ich dann von diesem Verzeichnis aus in einem Cookie. Damit erreiche ich, dass das Cookie nur bei Auffrufen für dieses Verzeichnis gesendet wir (Danke an Edgar für den Tipp!).

                                      $extensions = array('jpg','jpeg','jpe');
                                      hier könntest du noch einen kommaspearierten String draus machen und das array mittels explode() und trim bilden - dann ist es einfacher wartbar (auch für normale Menschen). Zudem würde ich die Variable besser beschreiben "allowed_extensions" oder "valid_extensions" damit man sofort erkennt, worum es sich handelt.

                                      Ja, dran feilen kann ich ja immer noch. Am besten noch vergolden :)

                                      wenn das elseif nicht zutrifft, hat deine funktion keinen Rückgabewert. Da die Callback-Funktion nur "true" durchlässt und "nicht gesetzt" != true ist, stimmts trotzdem - der form halber würde ich aber dediziert immer true oder false zurückgeben.

                                      Stimmt, muss noch ein else { return false;}dranhängen.

                                      1. Ich möchte den Einträgen im nun erhaltenen "jpeg/jpg/jpe*image/jpeg-Bilderauswahl"-Array neue Schlüssel zuweisen (0 bis X) und dann random(en).

                                        Warum einen neuen Schlüssel zuweisen, welchen Vorteil versprichst du dir daraus?

                                        Durchmischen machst du jedenfalls mit shuffle()

                                        Den Wert speichere ich dann von diesem Verzeichnis aus in einem Cookie.

                                        Welche Wert?

                                        Ja, dran feilen kann ich ja immer noch. Am besten noch vergolden :)

                                        Ich würde es an deiner Stelle gleich tun - sonst weißt du in 3 Monaten nicht mehr, was du dir dabei gedacht hast[sic!] :)

                                        1. Warum einen neuen Schlüssel zuweisen, welchen Vorteil versprichst du dir daraus?

                                          Wollte:
                                          1. count($array);
                                          2. Schlüssel vergeben von [0] bis [X]
                                          (Weil nach meiner Auswahl sind die Schlüssel ja durcheinander und nicht "chronologisch")
                                          3. rand(0,count($array);-1);
                                          4. Zahl speichern

                                          Den Wert speichere ich dann von diesem Verzeichnis aus in einem Cookie.
                                          Welche Wert?

                                          den Wert von "rand(0,count($array);-1);"

                                          Ich würde es an deiner Stelle gleich tun - sonst weißt du in 3 Monaten nicht mehr, was du dir dabei gedacht hast[sic!] :)

                                          Da magst Du recht habe. Also gut.

                                          1. Wieso einfach, wenn's auch kompliziert geht:

                                            array_rand()

                                            1. Wieso einfach, wenn's auch kompliziert geht:

                                              array_rand()

                                              Darum habe ich gefragt und ursprünglich shuffle() vorgeschlagen :) wenn du aber ohnehin das array auf einen einzelnen Wert reduzieren willst und dich der Key dann nicht mehr interessiert, ist array_rand() die eindeutig beste Wahl :)

                                              Darum ist es wichtig, ein Problem auf Teilprobleme herunterzubrechen und dann anhand der verfügbaren Funktionen die entstandenen Probleme zu lösen.

                                    3. die Bedingung innerhalb eines if kennt auch logische Operatoren - kein grund für den else-if-KRam

                                      Ich weiss, vorher hatte ich die auch benutzt. Aber die Zeile in der Bedingung wurde dann ziemlich lang und unübersichtlich. Ausserden vergass ich zig mal eine der 5. Klammern am Ende, um die Bedingung zu schliessen...

                                      1. Ich weiss, vorher hatte ich die auch benutzt. Aber die Zeile in der Bedingung wurde dann ziemlich lang und unübersichtlich. Ausserden vergass ich zig mal eine der 5. Klammern am Ende, um die Bedingung zu schliessen...

                                        Du kannst auch mehrzeilig schreiben und einrücken bzw. Klammern verwenden um das Zeug lesbarer machen.

                                        <?php  
                                          if ( // Bedingung auf xxx und yyy  
                                            (  
                                              $bar === true || // hier passiert das ODER  
                                              $baz != 0        // dieses hier  
                                            ) && (             // UND folgendes  
                                              $qux === $foo    // ja das hier  
                                            )  
                                          ) {  
                                            // do something  
                                          }  
                                        ?> 
                                        

                                        Kommentare und ein ordentlicher Einrückungsstil sind das A und O (oder besser Α und Ω) sind essentiell, um Programmcode oder Markup verständlich und lesbar zu halten.

                                    4. Hi Suit,

                                      $stringinfo = pathinfo($foo);
                                      $bildinfo = getimagesize($foo);
                                      Und das funktioniert? solange die Bilder im entsprechenden Verzeichnis liegen ja, aber in anderen fällen stimmt der Pfad nicht :)

                                      Du hattest wiedermal recht. Solange sich alles in ein & dem selben Verzeichnis abspielt abspielt gibt es kein Problem. Aber nachdem ich versucht habe das "teaserrandom"-Skript eine Ebene höher in die index.php per include() einzubinden, findet er die Bilder nicht mehr. Frage: muss ich bei den Pfadangaben IMMER von dem Verzeichnis ausgehen, von dem ich ein Skript später aufrufe, auch wenn es ich einem ganz anderen Verzeichnis liegt?

                                      Und dann noch was anderes:
                                      Zu Testzwecken habe ich die index.php, die teaserrandom.php und sämtlich Bilder in ein Verzeichnis gepackt, um das oben angeführt Problem zu vermeiden. Wenn ich die index.php (in der ja die teaserrandom.php included ist) aufrufe kommt eine Fehlermeldung, mit der ich überhaupt nichts anfangen kann.

                                      "Cannot modify header information - headers already sent by (output started at /Users/Thomas/Sites/test/media/index.php:7) in /Users/Thomas/Sites/test/media/teaserrandom.php on line 69"

                                      Hier mal die entsprechenden Zeilen den Dateien:
                                      index.php:

                                      7  <meta name="description" content="....." />
                                      8  <meta name="page-topic" content="....." />
                                      9  <meta name="keywords" content="....." />
                                      10 <meta name="author" content="....." />
                                      11 <meta name="revisit-after" content="....." />

                                      und teaserrandom.php:

                                      69 setcookie('teaser', $zufall, 0);

                                      Kannst Du, oder jemand anderes natürlich, mir einen Tipp geben? ;-)

                                      Danke und Gruß
                                      AirMax

                                      1. "Cannot modify header information - headers already sent by (output started at /Users/Thomas/Sites/test/media/index.php:7) in /Users/Thomas/Sites/test/media/teaserrandom.php on line 69"

                                        Da das Cookie ja über den header geschickt wird muss da wie eine Art "Platzhalter" für das Cookie noch eingebaut werden. Jemand eine Idee, wo ich mich da erkundigen kann?

                                        Danke

                                      2. Hallo AirMax,

                                        "Cannot modify header information - headers already sent by (output started at /Users/Thomas/Sites/test/media/index.php:7) in /Users/Thomas/Sites/test/media/teaserrandom.php on line 69"
                                        setcookie('teaser', $zufall, 0);

                                        wichtig ist hier nicht, was in der teaserrandom.php "on line 69" steht sondern, was in der index.php Zeile 7 (ff.) steht. Dort begann nämlich die Ausgabe an den Browser. PHP ist so gestrickt, dass es im normalen Zustand erst alle Header senden will, dann die Ausgabe erledigt. Da setcookie() einen HTTP-Header setzt, der offensichtlich nach der ersten Ausgabe auftaucht, kommt es zu der Meldung und der Header wird schlichtweg nicht mehr gesendet. Dafür aber die Fehlermeldung. Du musst also im Steuerfluss dafür sorgen, dass jedwede Ausgabe vorm include('teaserrandom.php') in der index.php unterbleibt. (Ausgaben können dabei auch Fehlermeldungen sein, da diese, nachdem ein Fehler vom Interpreter festgestellt wurde, augenblicklich zur Ausgabe gereicht wird. Ist diese Ungepuffert, führt das zur sofortigen Ausgabe. vgl. Ausgabepufferung)

                                        Gruß aus Berlin!
                                        eddi

                                        1. Hallo Eddi

                                          Header wird schlichtweg nicht mehr gesendet. Dafür aber die Fehlermeldung. Du musst also im Steuerfluss dafür sorgen, dass jedwede Ausgabe vorm include('teaserrandom.php') in der index.php unterbleibt.

                                          Danke für Deinen Tipp. Habe include() jetzt an den Anfang der index.php gesetzt und jetzt funzt es. Musste allerding die Ausgabe der 'teaserrandom.php' in einer Variable speichern, die ich in der index.php nach dem include abrufe. Vorher hatte ich ja genau an der Stelle includiert, an der ich die Ausgabe der 'teaserrandom.php' verwenden wollte.

                                          Aber ich habe immer noch das Problem mit den Verzeichnispfaden: Sind die Pfade in der zu includierenden Datei hinfällig? Also ... muss ich immer von dem Verzeichnis ausgehen, in das includiert wird. Das würde ja heißen, dass die Includ-Datei nicht "referenziert" wird, sondern per "copy / paste" eingebunden wird. Das wäre echt schade. Kann man die Verzeichnisangaben nicht irgendwie aufrecht erhalten?

                                          Gruß
                                          AirMax

                                          1. Re:

                                            Danke für Deinen Tipp. Habe include() jetzt an den Anfang der index.php gesetzt und jetzt funzt es. Musste allerding die Ausgabe der 'teaserrandom.php' in einer Variable speichern, die ich in der index.php nach dem include abrufe. Vorher hatte ich ja genau an der Stelle includiert, an der ich die Ausgabe der 'teaserrandom.php' verwenden wollte.

                                            Kleiner Trick:

                                            <?php echo include('x.inc'); ?>

                                            <?php  
                                            # Datei x.inc  
                                            return('Huhu');  
                                            ?>
                                            

                                            Aber ich habe immer noch das Problem mit den Verzeichnispfaden: Sind die Pfade in der zu includierenden Datei hinfällig? Also ... muss ich immer von dem Verzeichnis ausgehen, in das includiert wird. Das würde ja heißen, dass die Includ-Datei nicht "referenziert" wird, sondern per "copy / paste" eingebunden wird. Das wäre echt schade. Kann man die Verzeichnisangaben nicht irgendwie aufrecht erhalten?

                                            Mache Dir klar, wo das Programm tatsächlich stattfindet und was ein ausgelagerter Programmteil ist! Von dieser Sicht aus ist das Verhalten von PHP sehr viel sinnvoller. Dennoch bist Du nicht vom Verhalten PHPs abhängig. Arbeite mit der vordefinierten Konstante __DIR__!

                                            Gruß aus Berlin!
                                            eddi

                                            1. Danke für Deinen Tipp. Habe include() jetzt an den Anfang der index.php gesetzt und jetzt funzt es. Musste allerding die Ausgabe der 'teaserrandom.php' in einer Variable speichern, die ich in der index.php nach dem include abrufe. Vorher hatte ich ja genau an der Stelle includiert, an der ich die Ausgabe der 'teaserrandom.php' verwenden wollte.

                                              Kleiner Trick:

                                              <?php echo include('x.inc'); ?>

                                              <?php

                                              Datei x.inc

                                              return('Huhu');
                                              ?>

                                                
                                              So einfach, wie ich es mir vorgestellt habe ging es eben doch nicht. Nochmals das Problem:  
                                              Ich habe die 'index.php', in der der html-Code ist. Ab ca. der Mitte, nachdem schon html ausgegeben wurde, soll die 'teaserrandem.php' includiert werden, die die headerinfo für den Cookie enthält. Und jetzt kommt eben das Problem, dass die headerinfos für 'index.php' schon gesendet wurden und deshalb mein includierter Cookie-header Pech hat. Dann hatte ich mal den include an den Anfang gesetzt, bevor html ausgegeben wird. Und siehe da, es hat funktioniert. Aber das nützte mir nicht viel, da ich ja, layoutbedingt, den include zu einem späteren Zeitpunkt brauche. Zunächst dachte ich, dass ich was an der Logik HTML und PHP ändern müsste. Aber ich finde, dass sie so ok ist.  
                                              Jetzt habe ich aber was gefunden, was vielleicht funktionieren könnte.  
                                              Die Zauberworte sind `ob_start();`{:.language-php} und `ob_end_flush();`{:.language-php}. Ich includiere meine 'teaserrandom.php' gleich zu Beginn, jedoch leite ich die PHP-Ausgabe (bis auf den Cookie-header!) nicht an den Clienten, sondern in einen internen cache um. Erst wenn ich die PHP-Ausgabe zu einem späteren Zeitpunkt benötige, lese ich sie mit `ob_end_flush();`{:.language-php} aus. Klingt gut.  
                                                
                                              Wenn jemand noch eine andere Idee ... bitte melden!  
                                                
                                              Danke & Gruss  
                                              AirMax
                                              
                                              1. Re:

                                                ...Dann hatte ich mal den include an den Anfang gesetzt, bevor html ausgegeben wird. Und siehe da, es hat funktioniert. Aber das nützte mir nicht viel, da ich ja, layoutbedingt, den include zu einem späteren Zeitpunkt brauche. Zunächst dachte ich, dass ich was an der Logik HTML und PHP ändern müsste. Aber ich finde, dass sie so ok ist.

                                                Daraus schließe ich, dass Du noch ein paar Schwierigkeiten bei der Organisierung Deines Programms hast.

                                                [...Ausgabepufferung...]

                                                Wenn jemand noch eine andere Idee ... bitte melden!

                                                Trenne Dein Programm in die einzelnen Bestandteile auf. Was ich damit meine, und welche Möglichkeiten Du dadurch in der Hand hast, lässt sich am besten praktisch erklären. Daher bitte ich Dich, den Quellcode index.php und teaserrandem.php auf Deinem Web zugänglich zu machen!

                                                Gruß aus Berlin!
                                                eddi

                                                1. Hi Eddi

                                                  Daher bitte ich Dich, den Quellcode index.php und teaserrandem.php auf Deinem Web zugänglich zu machen!

                                                  Jupp. Mach ich heute im Laufe des Abends.
                                                  bis denne ...

                                                  1. Daher bitte ich Dich, den Quellcode index.php und teaserrandem.php auf Deinem Web zugänglich zu machen!

                                                    Jupp. Mach ich heute im Laufe des Abends.
                                                    bis denne ...

                                                    So, hier geht's zur index.php.
                                                    Und hier ist die 'teaserrandom.php':

                                                      
                                                    <?php  
                                                    // Aktuelles Verzeichnis oeffnen und mit $handler zur Verfuegung stellen  
                                                    $handler = opendir('.');  
                                                      
                                                    // Schleife fuer das Einlesen des Ordnerinhaltes in $dateien  
                                                    while (($dateien = readdir($handler)) !== false) {  
                                                      
                                                    	// Dateien als array kontinuierlich in $array schreiben  
                                                    	$array[] = $dateien;  
                                                    }  
                                                    // Aktuelles Verzeichnis schliessen  
                                                    closedir($handler);  
                                                      
                                                    //......................  
                                                      
                                                    // $array mit der Funktion 'callback' filtrieren und mit $auswahl zur Verfuegung stellen  
                                                    $auswahl = array_filter($array, 'callback');  
                                                      
                                                    // Beginn der Funktion 'callback'  
                                                    function callback($foo) {  
                                                      
                                                    // Diverse Variablen fuer die Funktion  
                                                    $stringinfo = pathinfo($foo);  
                                                    // Bildinformationen des zu ueberpruefenden Strings $foo laden  
                                                    $imageinfo = getimagesize($foo);  
                                                    // Zugelassene Extensions als array in $validextensions zur Verfuegung stellen  
                                                    $validextensions = array('jpg', 'jpeg', 'jpe');  
                                                      
                                                    	// Start der Bedingungen fuer korrekte Dateiendung, Ausschluss von 'portrait.jpg' und korrenten MIME-Typ  
                                                    	if (  
                                                    		// Bedingung fuer korrekte Dateiendung  
                                                    		(in_array((strtolower($stringinfo['extension'])), $validextensions))  
                                                    		// UND  
                                                    		&&  
                                                    		// Bedingung fuer Ausschluss von 'portrait.jpg'  
                                                    		($foo != strtolower('portrait.jpg'))  
                                                    		// UND  
                                                    		&&  
                                                    		// Bedingung fuer korrekten MIME-Typ 'image/jpeg'  
                                                    		(($imageinfo[mime]) == 'image/jpeg')  
                                                    	   // Ende der Bedingungen  
                                                    	   ) {  
                                                    		return true;  
                                                    	     }  
                                                    		else {  
                                                    		return false;  
                                                    	     }  
                                                    // Ende der Funktion 'callback'  
                                                    }  
                                                      
                                                    //......................  
                                                      
                                                    //1 Schluessel innerhalb des Arrays $auswahl zufaellig waehlen und in $zufall speichern  
                                                    $zufall = array_rand($auswahl, 1);  
                                                      
                                                    // Start der Bedingung  
                                                    if (  
                                                    	// Falls kein Cookie 'teaser' vorhanden  
                                                    	!$_COOKIE['teaser']  
                                                       // Ende der Bedingung  
                                                       ) {  
                                                    	// Cookie 'teaser' setzen und Wert $zufall zuweisen  
                                                    	// Der Cookie ist fuer eine Sitzung gueltig und wird nach dem Schliessen des Browsers geloescht  
                                                    	setcookie('teaser', $zufall, 0);  
                                                    	echo $auswahl[$zufall];  
                                                    	 }  
                                                    	else {  
                                                    	echo $auswahl[$_COOKIE['teaser']];  
                                                    	 }  
                                                    ?>  
                                                    
                                                    

                                                    Ich hoffe, die ganzen Kommentare stören nicht zu sehr...

                                                    1. Re:

                                                      So, hier geht's zur index.php.

                                                      Da hätte ich gerne den Quelltext gesehen. Kannst Du eine Kopie als index.php.txt hochladen? Danke.

                                                      Gruß aus Berlin!
                                                      eddi

                                                      1. Kannst Du eine Kopie als index.php.txt hochladen? Danke.

                                                        Klar, aber noch habe ich nichts an der 'index.html' gemacht. Habe sie nur in 'index.php' umbenannt. Hier geht's lang.

                                                        Gruß

                                                        1. Moment, schriebst Du nicht etwas davon, dass in der index.php teaserrandom.php per include() einbezogen wird? Mich interessiert ja nicht, der HTML-Quelltext sondern der PHP-Quellcode.

                                                          Gruß aus Berlin!
                                                          eddi

                                                          1. Moment, schriebst Du nicht etwas davon, dass in der index.php teaserrandom.php per include() einbezogen wird? Mich interessiert ja nicht, der HTML-Quelltext sondern der PHP-Quellcode.

                                                            Hab nochmals die index.php.txt hochgeladen.

                                                            1. Re:

                                                              Ach so einfach ist der Fall gelegen. Gut, dann erspare ich Dir die graue Theorie:

                                                              <?php  
                                                              // Content-Type als "application/xhtml+xml" deklarieren  
                                                              # header('Content-Type: application/xhtml+xml');  
                                                              # mit dem Content-Type-Header kann auch gleichfalls die Zeichenkodierung festgelegt werden. Zum einen kann man das mit header() machen...  
                                                              header('Content-Type: application/xhtml+xml; charset=utf-8');  
                                                              # ... zum anderen kann man das auch einfach durch Konfiguration machen:  
                                                              ini_set('default_mimetype','application/xhtml+xml');  
                                                              ini_set('default_charset', 'utf-8');  
                                                              # Dann wird teaserrandom.php eingebunden, womit sich das Problem -Header vor Textausgabe- erledigt  
                                                              $url=include('teaserrandom.php');  
                                                              ?>
                                                              
                                                              <?xml version="1.0" encoding="utf-8"?>  
                                                              <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
                                                              <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">  
                                                              <head>  
                                                              <title>thomaspetke</title>  
                                                              <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />  
                                                              <meta name="language" content="de" />  
                                                              <meta name="robots" content="index, follow" />  
                                                              <meta name="revisit-after" content="1 month" />  
                                                              <link rel="shortcut icon" type="image/x-icon" href="media/favicon.ico" />  
                                                              <link rel="stylesheet" type="text/css" href="css/general.css" />  
                                                              </head>  
                                                                
                                                              <body>  
                                                                <h1>  
                                                                  <object data="media/logo.svg" type="image/svg+xml" id="objectsvg">  
                                                                  <param name="src" value="media/logo.svg" />  
                                                                  thomaspetke  
                                                                  </object>  
                                                                </h1>  
                                                                <div id="center">  
                                                                  <ul id="navigation">  
                                                                    <li class="dark" lang="fr"><a href="htm/portrait.xhtml">Portrait</a></li>  
                                                                    <li class="dark" lang="la"><a href="htm/portfolio.xhtml">Portfolio</a></li>  
                                                                    <li class="dark"><a href="htm/kontakt.xhtml">Kontakt</a></li>  
                                                                    <li class="dark" lang="en"><a href="htm/links.xhtml">Links</a></li>  
                                                                    <li class="dark" lang="en"><a href="htm/sitemap.xhtml">Sitemap</a></li>  
                                                                  </ul>  
                                                                  <object data="media/
                                                              ~~~`<?php echo $url;?>`{:.language-php}~~~html
                                                              " type="image/jpeg" id="objectimg">  
                                                                  <param name="src" value="media/
                                                              ~~~`<?php echo $url;?>`{:.language-php}~~~html
                                                              " />  
                                                                  teaser  
                                                                  </object>  
                                                                  <p class="light" id="footer">&#169; 2009</p>  
                                                                  <object data="media/footerbg.svg" type="image/svg+xml" id="footerbg">  
                                                                  <param name="src" value="media/footerbg.svg" />  
                                                                  </object>  
                                                                </div>  
                                                              </body>  
                                                              </html>
                                                              

                                                              Als nächstes wir teaserrandom.php etwas modifiziert:

                                                              <?php  
                                                              $handler = opendir('.');  
                                                              while (($dateien = readdir($handler)) !== false) {  
                                                                  if(!in_array($dateien,array('.','..'){  
                                                                      $array[] = $dateien;  
                                                                  }  
                                                              }  
                                                              closedir($handler);  
                                                                
                                                              //......................  
                                                                
                                                              $auswahl = array_filter($array, 'callback');  
                                                                
                                                              function callback($foo) {  
                                                                
                                                              //......................  
                                                              }  
                                                                
                                                              //......................  
                                                                
                                                              $zufall = array_rand($auswahl, 1);  
                                                                
                                                              if(!$_COOKIE['teaser']) {  
                                                                      setcookie('teaser', $zufall, 0);  
                                                                      return($auswahl[$zufall]);  
                                                              }  
                                                              else {  
                                                                      return($auswahl[$_COOKIE['teaser']]);  
                                                              }  
                                                              ?>
                                                              

                                                              Gruß aus Berlin!
                                                              eddi

                                                              1. Hallo Eddi

                                                                Schon mal vielen Dank für Deine Hilfe!

                                                                Ach so einfach ist der Fall gelegen.

                                                                Ja, ja, nichts weltbewegendes. Zum lernen reichts vollkommen aus!

                                                                Ich wusste gar nicht, dass man in PHP auch mit '#' kommentieren kann. Mal was anderes.

                                                                Dann wird teaserrandom.php eingebunden, womit sich das Problem -Header vor Textausgabe- erledigt
                                                                <?php $url=include('teaserrandom.php'); ?>

                                                                <?php echo $url; ?>
                                                                Klingt absolut einleuchtend.

                                                                Als nächstes wir teaserrandom.php etwas modifiziert:

                                                                while (($dateien = readdir($handler)) !== false) {
                                                                    if(!in_array($dateien,array('.','..'){
                                                                        $array[] = $dateien;
                                                                    }
                                                                }

                                                                Sehe ich das richtig? Du willst also schon beim Einlesen der Dateinen auf die zulässige Extension überprüfen? Klingt eigentlich logisch. Mann muss ja nicht alles einsammeln, um die Hälfte später wieder von Bord zu werfen. Ich frage mich nur, ob '$dateien' an dieser Stelle schon ein array ist.  
                                                                  
                                                                
                                                                > `$auswahl = array_filter($array, 'callback');`{:.language-php}  
                                                                > `function callback($foo) {`{:.language-php}  
                                                                
                                                                Hier hat sich glaub' nichts geändert...  
                                                                  
                                                                
                                                                > ~~~php
                                                                
                                                                if(!$_COOKIE['teaser']) {  
                                                                
                                                                >         setcookie('teaser', $zufall, 0);  
                                                                >         return($auswahl[$zufall]);  
                                                                > }  
                                                                > else {  
                                                                >         return($auswahl[$_COOKIE['teaser']]);  
                                                                > }
                                                                
                                                                

                                                                Macht es einen Unterschied, ob man 'echo' oder 'return' nimmt? Also 'echo' für die tatsächliche Ausgabe und 'return' für die "Weiterverwendung" der Ausgabe.

                                                                Gruß aus Berlin!

                                                                Gruß NACH Berlin!

                                                                1. Re:

                                                                  Sehe ich das richtig? Du willst also schon beim Einlesen der Dateinen auf die zulässige Extension überprüfen? Klingt eigentlich logisch. Mann muss ja nicht alles einsammeln, um die Hälfte später wieder von Bord zu werfen. Ich frage mich nur, ob '$dateien' an dieser Stelle schon ein array ist.

                                                                  Erstmal wurden nur die Verzeichniseinträge für das eigene und übergeordnete Verzeichnis ausgeschlossen. Ansonsten macht es Sinn, egal bei welchen Aufgabenstellungen immer nur die Daten zu sammeln, die tatsächlich für weitere Verarbeitungsschritte benötigt werden. So könnte man die Erweiterung bereits beim Einlesen mittels if(in_array(substr($dateien,-4),array('.jpg', 'jpeg', '.jpe'))){} prüfen. Und wo wir gerade beim Verbessern sind, halte den Einsatz von getimagesize() für übertrieben. Der Webserver selbst bestimmt den Mediatyp einer Datei an seiner Erweiterung. Somit ist es auch für PHP ausreichend zu prüfen, ob die Dateierweiterung auf .jpg, jpeg oder .jpe endete, um den Typ als image/jpeg zu bestimmen.

                                                                  if(!$_COOKIE['teaser']) {

                                                                  setcookie('teaser', $zufall, 0);
                                                                          return($auswahl[$zufall]);
                                                                  }
                                                                  else {
                                                                          return($auswahl[$_COOKIE['teaser']]);
                                                                  }

                                                                  
                                                                  > Macht es einen Unterschied, ob man 'echo' oder 'return' nimmt? Also 'echo' für die tatsächliche Ausgabe und 'return' für die "Weiterverwendung" der Ausgabe.  
                                                                    
                                                                  Das war der kleine Trick, denn ich Dir [oben](https://forum.selfhtml.org/?t=192190&m=1283021) schon mal vermitteln wollte. Während `echo`{:.language-php} sich immer absolut gleich verhält, bewirkt `return`{:.language-php} die Veränderung des Rückgabewertes von `include`{:.language-php}, der sonst bei true oder false liegt. Darüber hinaus beendet return sofort die Abarbeitung der einbezogenen Datein (im Beispiel teaserrandom.php). Sieh Dir dazu die Beschreibung von [include()](http://de2.php.net/manual/de/function.include.php) im Manual an!  
                                                                    
                                                                    
                                                                  Gruß aus Berlin!  
                                                                  eddi
                                                                  
                                                                  1. Erstmal wurden nur die Verzeichniseinträge für das eigene und übergeordnete Verzeichnis ausgeschlossen.

                                                                    Ach so, dann waren die Punkte als solches zu verstehen. Ich dachte, Du meintest sie als Platzhalter.

                                                                    Ansonsten macht es Sinn, egal bei welchen Aufgabenstellungen immer nur die Daten zu sammeln, die tatsächlich für weitere Verarbeitungsschritte benötigt werden.

                                                                    Eben, das finde ich einleuchtend.

                                                                    Und wo wir gerade beim Verbessern sind, halte den Einsatz von getimagesize() für übertrieben. Der Webserver selbst bestimmt den Mediatyp einer Datei an seiner Erweiterung. Somit ist es auch für PHP ausreichend zu prüfen, ob die Dateierweiterung auf .jpg, jpeg oder .jpe endete, um den Typ als image/jpeg zu bestimmen.

                                                                    Suit hat nur angemerkt, dass es sein könnte, dass eine jpg-Datei nicht unbedingt eine jpg-Datei ist, nur weils sie die Extension hat...

                                                                    Das war der kleine Trick, denn ich Dir oben schon mal vermitteln wollte.

                                                                    Ja, ich wusste, dass es noch irgendetwas mit Deinem Tipp auf sich hatte. Ich hatte immer nur echo vor include() gesehen und habe mich gefragt, ob das Sinn macht?! Das return in der 'teaserrandom.php' hatte ich vollkommen übersehen.
                                                                    Also, ich schlage vor, ich probier die ganze Sache mal aus. Falls es nicht klappt, melde ich mich wieder.

                                                                    Danke & Gruss

                                                                    1. Re:

                                                                      Suit hat nur angemerkt, dass es sein könnte, dass eine jpg-Datei nicht unbedingt eine jpg-Datei ist, nur weils sie die Extension hat...

                                                                      Womit Suit formal recht hat. Alle gängigen Webserver nutzen aber ausschließlich die Dateinamenserweiterungen, um den Mediatyp zu bestimmen. Das sollte Suit, wenn er solche Haarspaltereien betreibt, aber wissen.

                                                                      Also, ich schlage vor, ich probier die ganze Sache mal aus. Falls es nicht klappt, melde ich mich wieder.

                                                                      HF

                                                                      Gruß aus Berlin!
                                                                      eddi

                                                                      1. Womit Suit formal recht hat. Alle gängigen Webserver nutzen aber ausschließlich die Dateinamenserweiterungen, um den Mediatyp zu bestimmen. Das sollte Suit, wenn er solche Haarspaltereien betreibt, aber wissen.

                                                                        Ich hab' nichts gesagt ... :D

                                                                        HF

                                                                        klar doch ...

                                                                        Gruss

                                            2. Arbeite mit der vordefinierten Konstante __DIR__!

                                              Habe jetzt mal versucht die relativen Pfade füd die Includes in "relative" absolute Pfade mit __DIR__ umzuwandeln. Das funktioniert auch gut bei Verzeichnissesn, die unter dem Verzeichnis liegen, aus dem der include aufgerufen wird. Gibte es auch eine Möglichkeit, __DIR__ für Verzeichnisse anzuwenden, die über dem aktuellen Verzeichnis liegen? Hab' mal folgendes probiert:

                                              include __DIR__ . '../bin/include.inc';

                                              Er findet aber die include.inc nicht. Gibt's da was?

                                              Danke & Gruss

                                              1. Hallo AirMax,

                                                Arbeite mit der vordefinierten Konstante __DIR__!

                                                An sich hatte ich Dein Problem so verstanden, dass teaserrandom.php in einem Unterverzeichnis liegt und Du die Aufgaben des Programmteils innerhalb dieser Datei mit dessen Verzeichnis verbinden wolltest. Somit könnte teaserrandom.php mittels $handler = opendir(__DIR__); in Verschiedene Verzeichnisse abgelegt werden, wobei jeweils nur der Pfad im aufrufenden Programm angepasst werden müsste:

                                                /test
                                                  |
                                                  |-/media
                                                  |  |
                                                  |  |-0.jpg
                                                  |  |
                                                  |  |-1.jpg
                                                  |  |
                                                  |  -teaserrandom.php   |   |-/img   |  |   |  |-2.jpg   |  |   |  |-3.jpg   |  |   |  |-4.jpg   |  |   |-teaserrandom.php
                                                  |
                                                  `-index.php

                                                In der index.php, was hierbei den Aufruf enthält, kann nun ohne weiter Anpassungen in teaserrandom.php zwischen include('media/teaserrandom.php'); und include('img/teaserrandom.php'); gewechselt werden.

                                                Habe jetzt mal versucht die relativen Pfade füd die Includes in "relative" absolute Pfade mit __DIR__ umzuwandeln. Das funktioniert auch gut bei Verzeichnissesn, die unter dem Verzeichnis liegen, aus dem der include aufgerufen wird. Gibte es auch eine Möglichkeit, __DIR__ für Verzeichnisse anzuwenden, die über dem aktuellen Verzeichnis liegen? Hab' mal folgendes probiert:

                                                include __DIR__ . '../bin/include.inc';

                                                Er findet aber die include.inc nicht. Gibt's da was?

                                                realpath() ist Dein Freund, wenn es um sonstige Probleme im Zusammenhang mit Pfaden ginge - jedoch nicht hier. Und Du solltest im Gebrauch dringend darauf achten, dass __DIR__ eine Pfadangabe ohne abschließenden Slash "/" enthält. Es muss also include(__DIR__ . '/../bin/include.inc'); lauten, was nicht mehr bedeutet, als dass solche Pfadangaben im Beispiel mit include() selbständig aufgelöst werden.

                                                Gruß aus Berlin!
                                                eddi

                                                1. Hallo Eddi,

                                                  erstmal vielen Dank für Dein Durchhaltevermögen in diesem Post!

                                                  An sich hatte ich Dein Problem so verstanden, dass teaserrandom.php in einem Unterverzeichnis liegt und Du die Aufgaben des Programmteils innerhalb dieser Datei mit dessen Verzeichnis verbinden wolltest. Somit könnte teaserrandom.php mittels $handler = opendir(__DIR__); in Verschiedene Verzeichnisse abgelegt werden, wobei jeweils nur der Pfad im aufrufenden Programm angepasst werden müsste:

                                                  Du hast recht. So war es mal gedacht. 'teaserrandom.php' sollte im 'media'-Ordner abgelegt werden. Nachdem ich aber die 'teaserrandom.php' in die 'index.php' eingebunden hatte, musste ich mit Erstaunen feststellen, dass 'teaserrandom.php' nicht einmal mehr die Bilder im eigenen Verzeichnis finden konnte. Hatte dafür das Verzeichnis einnmal mit $handler = opendir('.'); und testweise mit $handler = opendir(__DIR__); angegeben. Selbst der Cookie, der ja ursprünglich nur für das Verzeichnis 'media' gelten sollte, verlor seinen Sinn. Das gültige Verzeichnis für ihn war, nach dem include, nicht mehr '/media', sondern '/'. Also war meine Überlegung: Wenn alles nach dem include vom Hauptverzeichnis ausgeht, kann ich meine Struktur gleich so ändern:

                                                  /
                                                  |
                                                  |-- php
                                                  |    |
                                                  |    |- teaserrandom.php
                                                  |    - andere "PHP-Geschichten" (z.B. formmailer) | |-- media |    | |    |- 0.jpg |    |- 1.jpg |    |- 2.jpg |- usw.
                                                  |
                                                  `- index.php

                                                  Hatte dann für opendir() folgendes verwendet: $handler = opendir($_SERVER['DOCUMENT_ROOT']. '/media');. So funktioniert es. Wobei mir Deine Ideen bezügl. der 'teaserrandom.php' (im gleichen Verzeichnis wie die Bilder) und des Cookies (nur für Verzeichnis '/media' gültig) absolut sympathisch sind.

                                                  In der index.php, was hierbei den Aufruf enthält, kann nun ohne weiter Anpassungen in teaserrandom.php zwischen include('media/teaserrandom.php'); und include('img/teaserrandom.php'); gewechselt werden.

                                                  Und genau das hat eben nicht funktioniert. Siehe oben. Ich kann es ja nochmals probieren. Vielleicht habe ich ja auch einen Fehler gemacht. Aber das Thema include() im Zusammenhang mit Pfadeangaben scheint es wirklich insich zu haben.
                                                  Übrigens muss ich immer auf dirname(__FILE__) umsteigen, da die PHP-Version bei meinem Webhoster < 5.3.0 ist.

                                                  Und Du solltest im Gebrauch dringend darauf achten, dass __DIR__ eine Pfadangabe ohne abschließenden Slash "/" enthält. Es muss also include(__DIR__ . '/../bin/include.inc'); lauten, was nicht mehr bedeutet, als dass solche Pfadangaben im Beispiel mit include() selbständig aufgelöst werden.

                                                  Stimmt, dass kann man immer ganz gut an der Fehlermeldung sehen, dass ein Slash fehlt.

                                                  Gruss
                                                  AirMax

                                                  1. Re:

                                                    ...Nachdem ich aber die 'teaserrandom.php' in die 'index.php' eingebunden hatte, musste ich mit Erstaunen feststellen, dass 'teaserrandom.php' nicht einmal mehr die Bilder im eigenen Verzeichnis finden konnte. Hatte dafür das Verzeichnis einnmal mit $handler = opendir('.'); und testweise mit $handler = opendir(__DIR__); angegeben. Selbst der Cookie, der ja ursprünglich nur für das Verzeichnis 'media' gelten sollte, verlor seinen Sinn. Das gültige Verzeichnis für ihn war, nach dem include, nicht mehr '/media', sondern '/'. Also war meine Überlegung: Wenn alles nach dem include vom Hauptverzeichnis ausgeht, kann ich meine Struktur gleich so ändern:

                                                    /
                                                    |
                                                    |-- php
                                                    |    |
                                                    |    |- teaserrandom.php
                                                    |    - andere "PHP-Geschichten" (z.B. formmailer) | |-- media |    | |    |- 0.jpg |    |- 1.jpg |    |- 2.jpg |- usw.
                                                    |
                                                    `- index.php

                                                    Hatte dann für opendir() folgendes verwendet: $handler = opendir($_SERVER['DOCUMENT_ROOT']. '/media');. So funktioniert es. Wobei mir Deine Ideen bezügl. der 'teaserrandom.php' (im gleichen Verzeichnis wie die Bilder) und des Cookies (nur für Verzeichnis '/media' gültig) absolut sympathisch sind.

                                                    Na dann machen wir jetzt mal Nägel mit Köpfen:

                                                    Ich hatte Dir ein völlig anderes Konzept, da ja Dein Lieblingswort Effizienz ist, vorgeschlagen, was jetzt umgesetzt wird. (Punkt) Vergiss include()!

                                                    Aus der index.php wird, soweit nicht andere Verarbeitungen mittels PHP vorzunehmen sind, ein ganz normals HTML-Dokument Namens index.xhtml. In dieser wird der Verweis im Objekt hart codiert:

                                                        <object data="php/teaserrandom.php" type="image/svg+xml" id="footerbg">  
                                                          <param name="src" value="php/teaserrandom.php" />  
                                                        </object>
                                                    

                                                    Wobei wir eh nur von JPEG-Bildern reden, also reicht ein einfaches <img src="php/teaserrandom.php" alt="Zufallsbild"/>.

                                                    teaserrandom.php könnte nunmehr seine Kekse fürs Verzeichnis /php verteilen, was aber genauso effizient wie auch nebensächlich ist. Dein o. g. Gliederung des Webs ist nicht auf diese spezifische Aufgabe, cookies effizient zu setzen, ausgerichtet. (Das ließe sich bspw. mit mod_rewrite gerade rücken. Aber alles zu seiner Zeit.)
                                                     Seinerseits wird in teaserrandom.php das Verzeichnis /media dann so ausgelesen und die Bilder direkt ausgeben:

                                                    # Header vorangesetzt  
                                                    header('Content-Type: image/jpeg');  
                                                      
                                                    $handler=opendir('../media');  
                                                      
                                                    while (($dateien = readdir($handler))!==false) {  
                                                        if(in_array(substr($dateien,-4),array('.jpg','jpeg','.jpe'))){  
                                                            $array[] = $dateien;  
                                                        }  
                                                    }  
                                                    closedir($handler);  
                                                      
                                                    # Weiter geht es dann mit  
                                                      
                                                    $zufall=array_rand($auswahl, 1);  
                                                      
                                                    if(!isset($_COOKIE['teaser'])){  
                                                        setcookie('teaser', $zufall, 0);  
                                                        $file='../media/'.$auswahl[$zufall];  
                                                    }  
                                                    else{  
                                                        $file='../media/'.$auswahl[$_COOKIE['teaser']];  
                                                    }  
                                                    # Größe noch dem Browser mitgeteilt  
                                                    header('Content-Length: '.filesize($file));  
                                                    # Inhalt ausgeben  
                                                    readfile($file);
                                                    

                                                    Mehr ist es letztendlich gar nicht. Wenn Du es soweit zum laufen gebracht hast, können wir uns dann nochmals um die Effizienz der Kekse kümmern.

                                                    Gruß aus Berlin!
                                                    eddi

                                                    1. Hallo Eddi

                                                      Na dann machen wir jetzt mal Nägel mit Köpfen:

                                                      Ja genau, wir müssen uns langsam beeilen. Denn bald ist der Post im Archiv und dann ist Schluss ... ;)

                                                      Ich hatte Dir ein völlig anderes Konzept, da ja Dein Lieblingswort Effizienz ist, vorgeschlagen, was jetzt umgesetzt wird. (Punkt) Vergiss include()!

                                                      Ich schlage vor, dass ich ab jetzt zweigleisig fahre. Beide Varianten abwäge und dann am Ende schaue, für welche ich mich entscheide.

                                                        
                                                      
                                                      > # Header vorangesetzt  
                                                      > header('Content-Type: image/jpeg');  
                                                      > # Größe noch dem Browser mitgeteilt  
                                                      > header('Content-Length: '.filesize($file));  
                                                      > # Inhalt ausgeben  
                                                      > readfile($file);
                                                      
                                                      

                                                      Nur mal so aus Interesse: Ist es notwendig dem Browser mitzuteilen, was er jetzt empfängt? Also ein jpeg-Bild, dass XX kb groß ist. Spielt das eine Rolle für ihn? Ist es dann besser bei jeglichen Daten, die der Browser durch PHP mittels readfile() empfängt zu deklarieren.

                                                      Mehr ist es letztendlich gar nicht. Wenn Du es soweit zum laufen gebracht hast, können wir uns dann nochmals um die Effizienz der Kekse kümmern.

                                                      Hab's mal angepasst und es ist jetzt am Laufen. Und jetzt geht's mit den Keksen weiter? Schön!

                                                      Gruß

                                                      1. Re:

                                                        header('Content-Type: image/jpeg');
                                                        header('Content-Length: '.filesize($file));
                                                        readfile($file);

                                                        Nur mal so aus Interesse: Ist es notwendig dem Browser mitzuteilen, was er jetzt empfängt? Also ein jpeg-Bild, dass XX kb groß ist. Spielt das eine Rolle für ihn? Ist es dann besser bei jeglichen Daten, die der Browser durch PHP mittels readfile() empfängt zu deklarieren.

                                                        Für solche Fragen zu Content-Length ist die RFC 2616 Abs. 14.13 zuständig. Demnach ist es empfohlen, nicht ohne triftigen Grund auf diesen Header zu verzichten. Da jedoch Daten, die PHP ausgibt allermeist gestückelt werden (chunked transfer encoding), kann man darauf verzichten (vgl. Abs. 4.4).

                                                        Auf die Angabe des Content-type-Header kann nur aus triftigen Gründen verzichtet werden. Eine begünstigende Einschränkung, wie Bei Content-Length gibt es jedoch nicht (vgl. Abs. 7.2.1).

                                                        Mehr ist es letztendlich gar nicht. Wenn Du es soweit zum laufen gebracht hast, können wir uns dann nochmals um die Effizienz der Kekse kümmern.

                                                        Hab's mal angepasst und es ist jetzt am Laufen. Und jetzt geht's mit den Keksen weiter? Schön!

                                                        Das einfachste wäre teaserrandom.php im Verzichnis /media zu parken und dann, wie im PHP-Manual beschrieben ist, setcookie() als viertes Argument "/media" mitzugeben. Da es aber auch Deine Gliederung des Webs in z. B. /media und /php sehr hilfreich bei Wartungsarbeiten ist, würde ich Dir nach den Möglichkeiten Deines Providers mod_rewrite zu nutzen. Hierbei wird ein virtuelles Verzeichnis dem Browser in der index.xhtml benannt, in dem ein Bild sei, was dann von mod_rewrite auf /php/teaserrandom.php mapped. Dazu benötigst Du dann noch eine .htaccess-Datei im selben Verzeichnis der index.xhtml.

                                                        index.xhtml:
                                                        <img src="/teaser/cookies.jpg" alt="Zufallsbild"/>

                                                        .htaccess:

                                                        RewriteEngine On  
                                                        RewriteRule   ^/teaser/cookies.jpg$  /php/teaserrandom.php [L]
                                                        

                                                        Gruß aus Berlin!
                                                        eddi

                                                        1. Für solche Fragen zu Content-Length ist die RFC 2616 Abs. 14.13 zuständig. Demnach ist es empfohlen, nicht ohne triftigen Grund auf diesen Header zu verzichten. Da jedoch Daten, die PHP ausgibt allermeist gestückelt werden (chunked transfer encoding), kann man darauf verzichten (vgl. Abs. 4.4).

                                                          Auf die Angabe des Content-type-Header kann nur aus triftigen Gründen verzichtet werden. Eine begünstigende Einschränkung, wie Bei Content-Length gibt es jedoch nicht (vgl. Abs. 7.2.1).

                                                          Ok. Dann weiß ich jetzt Bescheid und werde in solchen Fällen die Headers immer brav mitschicken.

                                                          Das einfachste wäre teaserrandom.php im Verzichnis /media zu parken und dann, wie im PHP-Manual beschrieben ist, setcookie() als viertes Argument "/media" mitzugeben. Da es aber auch Deine Gliederung des Webs in z. B. /media und /php sehr hilfreich bei Wartungsarbeiten ist, würde ich Dir nach den Möglichkeiten Deines Providers mod_rewrite zu nutzen. Hierbei wird ein virtuelles Verzeichnis dem Browser in der index.xhtml benannt, in dem ein Bild sei, was dann von mod_rewrite auf /php/teaserrandom.php mapped. Dazu benötigst Du dann noch eine .htaccess-Datei im selben Verzeichnis der index.xhtml.

                                                          Gut, dann werde ich mich mal mit dem Thema 'mod_rewrite' genauer beschäftigen. Mal sehen, ob ich auf die Reihe bekomme. Wenn's nicht klappen sollte, habe ich ja immer noch die include()-Variante als Alternative.

                                                          Also Eddi, vielen Dank für Deine Hilfe und bis bald

                                                          AirMax

                                                2. Ach übrigens...
                                                  Ich habe jetzt mal meine ganzen Validierungsbedingungen für meinen 'Bilderarray', wie von Dir vorgeschlagen, an den Anfang verschoben. Und es klappt prima. Mein Lieblingswort ist 'Effizienz'!

                                                  Freu' mich wie bolle ...

                                                  Gruss

    3. Hi

      Nutze array_filter() und prüfe ob der in pathinfo() (extension) enthaltene Wert in_array() (du willst vermutlich .jpg, .jpeg und ggf .jpe finden) deiner erlaubten (oder verbotenen) Dateiendungen ist. zusätzlich solltest du dann noch mit getimagesize() den MIME-Type prüfen, ob dieser wirklich image/jpeg ist - die Endung selbst ist eigentlich nicht viel Wert.

      Habe nochmals an der Suchmaske gefeilt und habe jetzt die Lösung gefunden. Allerdings finde ich, dass preg_match besser zur Überprüfung von Benutzereingaben oder allgemein von dynamischen Inhalten passt. Da ich allerdings klar definierte Eigenschaften überprüfen möchte (Extensions), benutze ich doch lieber Anweisungen, die sich genau auf mein Ziel beziehen, z.B. $bar=pathinfo($foo); $bar['extension'].

      Das geht also auch:

        
      $auswahl = array_filter($array, 'callback');  
      function callback($foo) {  
        if (  
            (preg_match('/^(.+\.jpg|.+\.jpeg|.+\.jpe)$/i', $foo))  
            &&  
            (($imageinfo[mime]) == 'image/jpeg')  
           ) {  
            return true;  
             }  
            else {  
            return false;  
             }
      

      PS: Das war mein erstes Suchmuster, was ich gebastelt habe und auch funktioniert *schulterklopf*

      Gruß

      1. Allerdings finde ich, dass preg_match besser zur Überprüfung von Benutzereingaben oder allgemein von dynamischen Inhalten passt.

        Dein Ausdruck ist aber unsinnig

        /.(jpeg|jpe|jpg)$/i oder /.jp(eg|e|g)$/i (beides nicht getestet) würde völlig ausreichen.

        Da ich allerdings klar definierte Eigenschaften überprüfen möchte (Extensions), benutze ich doch lieber Anweisungen, die sich genau auf mein Ziel beziehen, z.B. $bar=pathinfo($foo); $bar['extension'].

        Nein tust du nicht - du prüst mit preg_match den vollständigen Dateinamen, nicht nur die Extension.

        Zwar ist die Lösung mit einem regulären Ausdruck eleganter, aber imho weniger leicht wartbar - besonders, wenn es um Benutzereingaben geht.

        Das geht also auch:

        Ja - aber ihmo weniger einfach verständlich (wenn man mit PCRE nicht so fit ist) und auf dauer eben Fehleranfälliger.

        1. Zwar ist die Lösung mit einem regulären Ausdruck eleganter, aber imho weniger leicht wartbar - besonders, wenn es um Benutzereingaben geht.

          Na ja, Benutzereingabe haben ja oft feste Muster, die in der Regel nicht mehr so schnell geändert werden. Z.B. für die Überprüfung einer eingegebenen Mailadresse in einem Formular. Wenn man allerdings ab und zu auch andere Extensions zulassen wollen würde, wäre die Fehlerquote u.U. schon höher.

          1. Na ja, Benutzereingabe haben ja oft feste Muster, die in der Regel nicht mehr so schnell geändert werden.

            Ja, das gemeinsame feste Muster von Benutzereingaben ist "irgendwie" :)

            Bau mal irgendwo testweise ein Datumsfeld in einem Formular ein, mit der bitte um TT.MM.YYYY als Datumsformat. Selbst an solchen Dingen scheitern sehr viele Nutzer.

            Wenn man allerdings ab und zu auch andere Extensions zulassen wollen würde, wäre die Fehlerquote u.U. schon höher.

            Genau aus dem Grund würde ich prinzipiell immer die Idiotensichere, schöne und vergoldete Variante verwenden - und keine ggf. potentiell Fehleranfällige, elegante (außer ich weiß, dass es defintiv so bleibt und nur ich oder andere Fachmänner(-frauen) dran herumfingern.

            Du hattest doch bereits eine schöne Lösung, warum musste die wieder raus? :D

            1. Du hattest doch bereits eine schöne Lösung, warum musste die wieder raus? :D

              Musste sie ja nicht. Sie wird bald ihren "Dienst aufnehmen" ;-)
              Hab' lediglich ein bisschen herumgespielt...

              1. Musste sie ja nicht. Sie wird bald ihren "Dienst aufnehmen" ;-)

                Na dann hab ich den Post falsch verstanden :D

                Hab' lediglich ein bisschen herumgespielt...

                Das ist nicht verkehrt :)