Eduard Ertl: Logischer Fehler bei for und/oder foreach

Hallo.

Ich möchte in meinem Gästebuch Smileys einbauen. Die werden als :-) in die Datenbank geschrieben, und so auch rausgeholt.
Vor dem Ausgeben möchte ich jetzt den Text scannen nach dem Vorkommen eines Smileys, und es ggf ersetzen.
Momentan mache ich das so:

  
function show($text){  
 //Smileykonfiguration holen  
 $import=file_get_contents("gb/smiley_conf.dat");  
  
 //Einlesen  
 $smiley_array=explode("\n",$import);  
 for($x=0;$x<count($smiley_array);$x++){  
  $smiley_array[$x]=explode(",",$smiley_array[$x]);  
 }  
  
// print_r($smiley_array);  
  
  
 //Text scannen nach Smileys  
 for($x=0;$x<count($smiley_array);$x++){  
  foreach($smiley_array[$x] as $smile){  
   $text = str_replace($smile,$smiley_array[$x][0],$text);  
   return $text;  
  }  
 }  
  
}  

Der Inhalt der Datei smiley_conf.dat:

<img src="gb/1.gif">,:-),:),:=)
<img src="gb/2.gif">,:-(,:(,:=(

Die Aufteilung des Dateiinhalts in ein mehrdimensionales Array klappt wie ich es wollte, das sagt mir print_r.
Also muss der Fehler irgendwo unten in den for und foreach-Schleifen liegen. Nur finde ich ihn nirgends. Wo ist er denn?

PS: Ich habe den Code selber geschrieben und nirgendwo anders hergeholt.

Viele Grüße
Eduard Ertl

  1. Sorry, diese Info hab ich noch vergessen:

    Es kommt keine Fehlermeldung, das Smiley wird einfach nur nicht ersetzt und wird als :-) ausgegeben.
    Es wird mit der Funktion htmlentities in die Datenbank geschrieben, sodass keine äöüß und sonstige Umlaute in die Datenbank kommen. Soweit ich das sehe, wird ein Smiley nicht umgewandelt, da es keine umwandelbaren Teile besitzt (zumeist, ich weiß, aber die was ich momentan definiert habe, haben nichts umwandelbares).

  2. Hallo Eduard.

    //Smileykonfiguration holen
    $import=file_get_contents("gb/smiley_conf.dat");

    //Einlesen
    $smiley_array=explode("\n",$import);

      
    Diese beiden Schritte kannst du per [file](http://de2.php.net/manual/de/function.file.php) zusammen fassen.  
      
    
    >  ~~~php
    
    for($x=0;$x<count($smiley_array);$x++){  
    
    >   foreach($smiley_array[$x] as $smile){  
    >    $text = str_replace($smile,$smiley_array[$x][0],$text);  
    >    return $text;  
    >   }  
    >  }
    
    

    Schau dir die Schleife einmal genau an und überlege, wo sie beendet wird. Momentan läuft sie nur ein einziges Mal durch.

    Einen schönen Sonntag noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. Hi Ashura,

      Schau dir die Schleife einmal genau an und überlege, wo sie beendet wird. Momentan läuft sie nur ein einziges Mal durch.

      Okay, dann nehm ich das Ding mal auseinander:

      foreach($smiley_array[$x] as $smile){

      Für jedes Element in $smiley_array, das in zweiter Ebene liegt, wird der Code durchgangen. Dabei wird das momentane Element für die Zeit in der die Schleife läuft, als $smile definiert.

      $text = str_replace($smile,$smiley_array[$x][0],$text);

      Hier wird jedes Vorkommen von $smile durch das erste Element des Arrays $smile_array[] in der Übergebenen Variable $text ersetzt...

      return $text;

      und zurückgegeben.

      }
      }

      Und hier werden die Schleifen geschlossen.

      Hmm, also es tut mir leid, ich sehe nicht, warum die Schleife ein einziges Mal nur durchlaufen sollte.

      Hilfst du mir bitte nochmal auf die Sprünge?

      Vielen Dank soweit.
      Eduard Ertl

      1. Hallo Eduard.

        Hmm, also es tut mir leid, ich sehe nicht, warum die Schleife ein einziges Mal nur durchlaufen sollte.

        Dann lies einmal die Beschreibung zu return im PHP-Handbuch.

        Einen schönen Montag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
        [HTML Design Constraints: Logical Markup]
        1. Hi

          Dann lies einmal die Beschreibung zu return im PHP-Handbuch.

          Soooo, jetzt hab ichs. Danke dir, wusste ich nicht dass return die Funktion einfach so beendet.

          Vielen vielen Dank
          Eduard Ertl

  3. Moin Eduart,

    Ich möchte in meinem Gästebuch Smileys einbauen. Die werden
    als :-) in die Datenbank geschrieben, und so auch rausgeholt.

    Vor dem Ausgeben möchte ich jetzt den Text scannen nach dem
    Vorkommen eines Smileys, und es ggf ersetzen.

    Ich Persoenlich mag es eigendlich nicht, wenn ich irgendwo

    Ungefragt< ein Bild fuer die vielen schoenen :) Text-Smiley's

    'hingeklatscht' bekomme... (Eventuell, weil ich schon recht 'Alt' bin
    und mit Text-Smiley's gross eworden bin? ;) und Besonders, die
    Zappeldinger (animiert ): mag ich gar nicht.

    Wenn du so etwas machen moechtest, dann biete es bitte per Link-
    option an die Text-Smiley's anzeigen zu lassen, oder eine kleine
    Hilfseite wie: SELFHTML-Chat Hilfe

    Wie auch immer, wenn du es aendern moechtest dann kannst du
    waehrend des auslesens aus der Datenbank mit preg oder ereg
    die Smiley's ersetzen.

      
    if(!isset($smileys) or ($smileys == "bild"))  
      {  
      $datenbank['text'] = ereg_replace("d:/i","&nbsp; <img src=\"/images/smiley/s_zunge.gif\" width=\"15\" height=\"15\" \nalt=\"Zunge raus streckend\" />", $datenbank['text']);  
      }  
      
    if (isset($smileys))  
      {  
      if ($smileys == "text")  
        {  
        $datenbank['text'] = ereg_replace("d:/i","&nbsp; <tt title=\"Zunge raus streckend\">d:</tt>", $datenbank['text']);  
        }  
      }  
    
    

    gruesse aus'm ruhrpott
      jens mueller

    --
    I am a scout. How can I use Perl in my day-to-day scout business? For example, helping little old ladies across the street. - See the perllol man page.
    1. Hallo Jens.

      Wie auch immer, wenn du es aendern moechtest dann kannst du
      waehrend des auslesens aus der Datenbank mit preg oder ereg
      die Smiley's ersetzen.

      Nein, wenn überhaupt bitte nur mit Hilfe der preg_*-Funktionen. Die alten ereg_*-Funktionen sollten nicht mehr genutzt werden.
      (Und was macht das Apostroph bei „Smileys“?)

      Aber warum sollte Eduard hier an Stelle der weitaus performanteren Stringfunktionen reguläre Ausdrücke verwenden?

      Einen schönen Sonntag noch.

      Gruß, Ashura

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
      [HTML Design Constraints: Logical Markup]
      1. echo $begrüßung;

        Nein, wenn überhaupt

        Da stimme ich zu. Für einfachen Zeichenkettentausch braucht man keine regulären Ausdrück. Dafür reichen die weniger teuren Stringfunktionen.

        bitte nur mit Hilfe der preg_*-Funktionen. Die alten ereg_*-Funktionen sollten nicht mehr genutzt werden.

        Hier lege ich Protest ein. Reguläre Ausdrücke im POSIX-Stil sind weder veraltet noch missbilligt. Die Perl-kompatiblen sind einfach "nur" leistungsfähiger.

        Aber warum sollte Eduard hier an Stelle der weitaus performanteren Stringfunktionen reguläre Ausdrücke verwenden?

        Ach, hier hast du das ja auch schon gesagt, dann kann ich ja den ersten Teil weglassen ...

        echo "$verabschiedung $name";

        1. Hallo dedlfix.

          bitte nur mit Hilfe der preg_*-Funktionen. Die alten ereg_*-Funktionen sollten nicht mehr genutzt werden.

          Hier lege ich Protest ein. Reguläre Ausdrücke im POSIX-Stil sind weder veraltet noch missbilligt.

          Von veraltet war auch nicht die Rede. Fakt ist, dass sie älter im Sinne von länger im PHP-Paket enthalten sind.

          Die Perl-kompatiblen sind einfach "nur" leistungsfähiger.

          Und damit vorzuziehen. Zudem sind die POSIX-kompatiblen Funktionen nicht binary-safe, was ihre Verwendung im worker- und prechild-MPM des Apachen unmöglich macht. (Sollte ich hier einem Irrglauben unterliegen, bitte ich Korrektur.)

          Einen schönen Sonntag noch.

          Gruß, Ashura

          --
          sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
          „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
          [HTML Design Constraints: Logical Markup]
    2. Moin Jens,

      Ich Persoenlich mag es eigendlich nicht, wenn ich irgendwo >Ungefragt< ein Bild fuer die vielen schoenen :) Text-Smiley's 'hingeklatscht' bekomme... (Eventuell, weil ich schon recht 'Alt' bin und mit Text-Smiley's gross eworden bin? ;) und Besonders, die Zappeldinger (animiert ): mag ich gar nicht.

      das geht mir ähnlich. Ein "Smiley" ist für mich eine Folge von Interpunktionszeichen, die mit etwas Phantasie als Grinsegesicht gesehen werden kann, wie z.B. der Klassiker :-) oder auch der Zwinkernde ;-) oder...
      Deshalb habe ich auch erst nicht verstanden, was Eduard damit:

      Ich möchte in meinem Gästebuch Smileys einbauen. Die werden als :-) in die Datenbank geschrieben, und so auch rausgeholt.

      sagen wollte - er *hat* doch schon Smileys drin. Womit will er sie ersetzen?
      Aber dann dämmerte mir, dass er sie wohl doch durch grafische Smileys austauschen möchte.

      Und ich glaube, Eduard, den entscheidenden Hinweis hat Ashura schon "durch die Blume" gegeben - hast du inzwischen gesehen, was er meinte?

      Schönen Tag noch,
       Martin

      --
      F: Was ist ekliger als ein angebissener Apfel mit einem Wurm drin?
      A: Ein angebissener Apfel mit einem halben Wurm.