PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : str_replace & foreach ausgabe


Sandra
30.06.2009, 00:18:56
Hallo,

ich habe folgendes Problem:
In einem Gästebuch lese ich den Eintrag aus und ersetze Zeichen durch Smilies. Das geht, aber die Ausgabe gibt so immer nur die Smilies.

$query_select9 = sprintf("SELECT message As m FROM cms_gb ");

$result9 = mysql_query($query_select9);

while ($zeile = mysql_fetch_object($result9)) {
$m = $zeile->m;
}
$suchArr= array(':)',':(',':P',':o');
$ersetzArr= array('<img src=images/smile.gif>','<img src=images/sad.gif>','<img src=images/tongue.gif>','<img src=images/scared.gif>');
$stringArr['$m'] =$m;

$content['$m'] = str_replace($suchArr, $ersetzArr, $stringArr);

foreach ($ersetzArr as $key=> $content) {
echo $key .$content."</br>";
}

Freue mich über einen Tip

DANKE

Sandra

lukgestach
30.06.2009, 03:00:59
Hallo,

So wie ich dein Code verstehe machst du alles richtig, bis auf die Ausgabe mit der foreach-Schleife. Denn da hast du in der Variable $key die ID des Arrays, in deinem Fall von 0 bis 3. In $content sind dann die Werte des Array gespeichert. Also die Bilder der Smileys...
Du gibst das dann per echo aus - ist ja klar, dass da nur die Smileys kommen, nicht?!

Der eigentliche Text ist dann in $content[] gespeichert, wobei du das als Variable und nicht als Array speichern musst (Weil str_replace ein String und kein Array zurückliefert)

Also müsste dein letzter Teil so aussehen:
$content = str_replace($suchArr, $ersetzArr, $stringArr);
echo "$content";
Dies gibt dann den Text mit den Smileys aus ;)

Gruss Lukas

Sandra
30.06.2009, 11:39:19
Hallo,

ja das habe ich mit print auch schon probiert und bekomme bei beiden die Einträge vielfach herausgegeben, z.b. bei 6 Einträgen bekomme ich 6x alle 6 Einträge

$suchArr= array(':)',':(',':P',':o');
$ersetzArr= array('<img src=images/smile.gif>','<img src=images/sad.gif>','<img src=images/tongue.gif>','<img src=images/scared.gif>');
$stringArr=$m;

$content = str_replace($suchArr, $ersetzArr, $stringArr);
//print_r ($content."<br>");
echo "$content";
}

Über eine weitere Idee freue ich mich

Sandra

Damir
01.07.2009, 22:06:02
Hallo Sandra,

ich bin ein wenig irritiert was Du mit manchen Dingen überhaupt anstellen willst ;-)

Was willst Du damit bezwecken?

while ($zeile = mysql_fetch_object($result9)) {
$m = $zeile->m;
}


Nach meiner Ansicht müsstest Du es so machen:
<?php

$suchArr = array('/:\)/','/:\(/','/:P/','/:o/');
$ersetzArr = array('<img src=images/smile.gif>','<img src=images/sad.gif>','<img src=images/tongue.gif>','<img src=images/scared.gif>');

while ($zeile = mysql_fetch_object($result9)) {

$text = preg_replace($suchArr, $ersetzArr, $zeile->m);

echo $text;

}

?>

Hier mal einfach so zum spielen:
$suchArr = array('/:\)/','/:\(/','/:P/','/:o/');
$ersetzArr = array('<img src=images/smile.gif>','<img src=images/sad.gif>','<img src=images/tongue.gif>','<img src=images/scared.gif>');

$text = 'Wenn ich :) und Du :( nichts machen :P dann ist das nunmal so :o';

$text = preg_replace($suchArr, $ersetzArr, $text);

echo $text;

Damir

Sandra
03.07.2009, 01:15:29
Hallo,

mit Zeichen im Array geschrieben und Bildnamen im Array klappt es.
Ich habe aber eine DB Tabelle mit den Smeilys und den dazugehörenden Zeichen,

also ID smeily, smeily_zeichen, smeily_image

genauso habe ich eine Tabelle mit den Gästebucheinträgen

also ID, message

Das Ersetzen funktioniert auch, aber die Datensätze werden so oft wie es Datenreihen mit Smeilys gibt wiederholt.

Ich habe mitlerweile mehrere Ansätze immer mit dem gleichen Ergebnis


//auslesen der Tabelle Smeily

$query_select3 = sprintf("SELECT image_smeily As smilie1, zeichen_smeily As s_zeichen FROM cms_smilies");
$result3 = mysql_query($query_select3);
while ($zeile = mysql_fetch_object($result3)) {
$s_zeichen = $zeile->s_zeichen;
$zeichen_gb=array($s_zeichen);
$s_image = $zeile->smilie1;
$s="<IMG SRC='images/".$s_image."'>";
$image_gb=array($s);


//auslesen des Eintrages

$query_select6 = sprintf("SELECT cms_gb.id, cms_gb.message As message, FROM cms_gb ");

$result6 = mysql_query($query_select6);
while ($zeile = mysql_fetch_object($result6)) {
$message = $zeile->message;

//ersetzen zeichen gegen image bei dem Eintrag
$message = str_replace ($zeichen_gb,$image_gb, $message);
echo "$message<br>"; } } }

Bei 3 Smeilys in der DB Smeilys bekomme ich nun eine 3 malige Wiederholung aller Einträge, wobei im ersten Durchlauf der Schleife das erste Smeily Zeichen ersetzt, im zweiten das ...

Wenn ich die Klammern am Ende anders setze bekomme ich nur das letzte Zeichen ersetzt.

Der Fehler ist irgendwo im Auslesen des Arrays. Aber auch wenn ich die Tabelle Smeily nicht nochmal extra als Array setze passiert das Gleiche. Select Distinct gibt auch keine Hilfe.

Eine foreach Schleife gibt auch das gleiche Ergebnis

function replacesmeily($x,$y,$z)
{
$smeily= array($y=>$z);

foreach($smeily as $temp=>$key)
{
$x = str_replace($temp,$key,$x);
}
return($x);

}

echo replacesmeily($message,$zeichen_gb,$image_gb)."</br>";

Hat Jemand noch eine Idee?

Damir
03.07.2009, 10:09:13
Hat Jemand noch eine Idee?

Hi, Du tust so als ob unsere Vorschläge alle nicht funktionieren, dabei sind sie aber richtig....

Du gehst schlichtweg falsch mit den Schleifen um!!!!!!!!!!!

Ist ja auch logisch denn du liest die Smileys in einer while-Schleife aus und machst dann in jedem Durchlauf (also für jeden Smiley) eine neue Abfrage der Einträge!!! Die SELECT-.Anweisung hat da gar nichts zu suchen... Letztendlich erzeugt du damit immer wieder doppelte und dreifache Ausgaben.

Damir

DokuLeseHemmung
03.07.2009, 10:37:41
Das Ersetzen funktioniert auch, aber die Datensätze werden so oft wie es Datenreihen mit Smeilys gibt wiederholt.
Etwas mehr Sorgfalt und Disziplin bitte!

Wenn du deinen Code ordendlich einrücken würdest, dann würdest du auch sehen warum sich das wiederholt.

Soll ich dir das mal "schön" machen?

Damir
03.07.2009, 10:41:57
Soll ich dir das mal "schön" machen?
Naja, wenn du ihr das schön machst dann wird sie es auch sehen warum es so nicht klappt - aber wenn sie es vernünftig einrückt sieht sie es auch und hat dabei noch was gelernt ;-)

DokuLeseHemmung
03.07.2009, 10:49:57
und hat dabei noch was gelernt
Naja...
Schon 3 Jahre dabei und über 90 Postings; ich befürchte ehr, dass Sie gar nicht weiß, was wir von ihr wollen...

Damir
03.07.2009, 11:00:47
Sandra,

also wir wollen Dir ja nichts böses ;-) Aber du hast das Thema völlig falsch angefasst...

Schau mal hier, wie man es machen könnte - natürlich gibt es auch andere Ansätze



// Smileys aus Datenbank lesen

while(......){
// Smileys in Array speichern
}

// Gästebuch Einträge auslesen

while(......){
// Gästebuch einträge durchsuchen bzw. ersetzen mit den Smileys

//
}



Das ist jetzt nur eine grobe Vorstellung...

Sandra
03.07.2009, 13:46:41
Hallo,

danke erst einmal für eure Anregungen. War ich bisher nicht depremiert bin ich's jetzt.
Arrays sind einfach nicht meine Stärke.

Hi Damir,

ich weiß das es daran liegt, das ich die TB Smeilys nicht als array richtig anordne,d.h. sie liegen nicht in einer Zeile als array vor und bekomme es einfach nicht hin.

Ich habe jetzt folgendes gemacht um die Smileys in Array zu speichern


while ($row = mysql_fetch_array($result3, MYSQL_ASSOC)) {
$s_image=($row["image_smeily"]);
$s_zeichen=($row["zeichen_smeily"]);
foreach($row as $s_image) {
$image=$s_image;
}
foreach($row as $s_zeichen) {
$zeichen= $s_zeichen;
}

}

}

bekomme jetzt immer beides die Smeily Zeichen und die Smeily Bilder, wodurch das Ersetzen nicht mehr geht.

Danke für Hilfe

Sandra

DokuLeseHemmung
03.07.2009, 16:11:41
Ach, herje, das ist ja immernoch nach dem Zufallsprinzip eingerückt..

Und: Variablen werden nicht schöner davon, wenn man sie öfter durch die Mühle dreht.


Hier mal mein Vorschlag:

//auslesen der Tabelle Smeily
$query_select3 = " SELECT image_smeily As smilie,
zeichen_smeily As zeichen
FROM cms_smilies";

$result3 = mysql_query($query_select3) or die(mysql_error());
$smilies = array(); // vorbesetzen
while($row = mysql_fetch_assoc($result3))
$smilies[$row['zeichen']] = "<IMG SRC='images/{$row['smilie']}'>";



//auslesen des Eintrages
$query_select6 = " SELECT message
FROM cms_gb ";

$result6 = mysql_query($query_select6) or die(mysql_error());
$message = ''; // vorbesetzen
while($row = mysql_fetch_assoc($result6))
$message .= $row['message'].'<br>';


// alles in einem Brocken umwandeln und ausgeben
echo strtr($message,$smilies);

Sandra
03.07.2009, 17:27:00
VIELEN DANK

ich wäre nie auf vorbesetzen und gleichsetzen gekommen. Da sieht mein Tag schon viel smeiliger aus.

Damir
03.07.2009, 17:43:47
Hi,

also hat es geklappt, ja? Schön:-)

Du solltest wirklich was an Deiner Einrückung ändern um den Code für Dich und andere lesbarer zu machen...

Ein Tipp von mir wegen Arrays... Wenn Du nicht weißt was drin steckt, lass es dir doch einfach mal ausgeben (mach dann am besten rechte Maustaste / Quelltext anzeigen, dann sieht es besser aus) - so lernst du auch ein bissl über Arrays.

Ist nur ein Beispiel, führ es mal bei Dir aus und schau dir den Quelltext an

<?php

$array = array ( 'Damir',
'Sandra',
'DokuLeseHemmung',
array('id' => 1,
'ort' => 'Koeln')
);

print_r( $array );

?>

Ausgabe wäre dann:
Array
(
[0] => Damir
[1] => Sandra
[2] => DokuLeseHemmung
[3] => Array
(
[id] => 1
[ort] => Koeln
)

)