Logischer Fehler bei for und/oder foreach
Eduard Ertl
- php
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
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).
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
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
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
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
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"," <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"," <tt title=\"Zunge raus streckend\">d:</tt>", $datenbank['text']);
}
}
gruesse aus'm ruhrpott
jens mueller
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
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";
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
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