Gnom: Assoziatives Array auslesen

Hi,

ich habe ein Asso.Array.
Dieses nehme ich um vorhande Platzhalter in einem String durch einen wert zu ersetzten:

$string="meine Mutter ist heute sehr #BAD# aber mein Vater ist #LOL#";
$array=array(
 "Böse"=>"#BAD#",
 "Lustig"=>"#LOL#"
);

foreach($array as $bild => $wert)
 {
   $änderung=str_replace($wert,$gemuet,$string);
 }
echo $änderung;

Theoretisch sollte der ausgegebene Text so aussehen:

meine Mutter ist heute sehr Böse aber mein Vater ist Lustig

aber das stimmt nicht, der erste wert #BAD# wird im String einfach nicht ersetzt, alles andere wie gewünscht.
Wieso nicht?
Ich habe das auch mit anderen werten gemacht aber der erster Platzhalter wird nicht ersetzt.
Kann mir einer helfen?

Danke

euer Gom(e)

  1. Hi,

    ich habe ein Asso.Array.
    Dieses nehme ich um vorhande Platzhalter in einem String durch einen wert zu ersetzten:

    $string="meine Mutter ist heute sehr #BAD# aber mein Vater ist #LOL#";
    $array=array(
    "Böse"=>"#BAD#",
    "Lustig"=>"#LOL#"
    );

    foreach($array as $bild => $wert)

    Nicht Bild, natürlich $gemuet, sorry.

    {
       $änderung=str_replace($wert,$gemuet,$string);
    }
    echo $änderung;

    Theoretisch sollte der ausgegebene Text so aussehen:

    meine Mutter ist heute sehr Böse aber mein Vater ist Lustig

    aber das stimmt nicht, der erste wert #BAD# wird im String einfach nicht ersetzt, alles andere wie gewünscht.
    Wieso nicht?
    Ich habe das auch mit anderen werten gemacht aber der erster Platzhalter wird nicht ersetzt.
    Kann mir einer helfen?

    Danke

    euer Gom(e)

  2. Ich grüsse den Cosmos,

    Was sagt ein var_dump($array)?

    Möge das "Self" mit euch sein

    --
    Neulich dachte ich mir, einmal S/M ausprobieren wäre eine tolle Erfahrung. Also hab ich Windows gebootet ...
    ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
    1. Hallo,

      Was sagt ein var_dump($array)?

      mhhh, sorry das kenne ich nicht. Was ist das?

      1. Ich grüsse den Cosmos,

        mhhh, sorry das kenne ich nicht. Was ist das?

        http://de.php.net/manual/de/function.var-dump.php

        Soll ichs dir vorlesen auch noch?

        Möge das "Self" mit euch sein

        --
        Neulich dachte ich mir, einmal S/M ausprobieren wäre eine tolle Erfahrung. Also hab ich Windows gebootet ...
        ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
        1. Hi,

          sorry, die ausgabe:
          array(2) { ["Böse"]=>  string(5) "#BAD#" ["Lustig"]=>  string(5) "#LOL#" }

          scheint alles richtig zu sein.

          1. Ich grüsse den Cosmos,

            Hi,

            sorry, die ausgabe:
            array(2) { ["Böse"]=>  string(5) "#BAD#" ["Lustig"]=>  string(5) "#LOL#" }

            scheint alles richtig zu sein.

            Schonmal probiert, den Umlaut wegzulassen?
            Mal abgesehen davon, das ich nicht verstehe, das du den text als Key benutzt und umgekehrt. Sinnvoller wäre IMO "#BAD#" => "böse"

            Möge das "Self" mit euch sein

            --
            Neulich dachte ich mir, einmal S/M ausprobieren wäre eine tolle Erfahrung. Also hab ich Windows gebootet ...
            ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
            1. Hallo Manuel,

              Schonmal probiert, den Umlaut wegzulassen?

              habe ich, keine veränderung, alles wird im String umgesetzt aber der erste Platzhalter nicht.

              Mal abgesehen davon, das ich nicht verstehe, das du den text als Key benutzt und umgekehrt. Sinnvoller wäre IMO "#BAD#" => "böse"

              Ja, danke stimmt, habe ich gemacht ;)

              Möge das "Self" mit euch sein

              hoffentlich wirkts bald auch mal bei mir...

              1. Hi,

                wieso benimmt sich das auslesen und ersetzen so komisch?
                Habe es mal geändert:

                $string="Wert #EINS# und wert #ZWEI# und wert #DREI# oder doch wert #ZWEI# ?";
                $array=array(
                  "#EINS#"=>"220",
                  "#ZWEI#"=>"260",
                  "#DREI#"=>"300"
                );
                foreach($array as $halter => $wert)
                 {
                   $änderung=str_replace($halter,$wert,$string);
                 }
                  echo $änderung;

                Ausgabe:
                Wert #EINS# und wert #ZWEI# und wert 300 oder doch wert #ZWEI# ?

                Es wird immer nur ein Wert ersetzt, ich verstehe echt nichts mehr...

                1. Hallo,

                  wieso benimmt sich das auslesen und ersetzen so komisch?

                  Nicht komisch. So, wie Du es programmiert hast.

                  Habe es mal geändert:

                  $string="Wert #EINS# und wert #ZWEI# und wert #DREI# oder doch wert #ZWEI# ?";
                  $array=array(
                    "#EINS#"=>"220",
                    "#ZWEI#"=>"260",
                    "#DREI#"=>"300"
                  );
                  foreach($array as $halter => $wert)
                  {
                     $änderung=str_replace($halter,$wert,$string);

                  ^Das meinst Du jetzt nicht ernst?

                  }
                    echo $änderung;

                  Ausgabe:
                  Wert #EINS# und wert #ZWEI# und wert 300 oder doch wert #ZWEI# ?

                  Es wird immer nur ein Wert ersetzt, ich verstehe echt nichts mehr...

                  Ja, immer der letzte im Array und somit der letzte in der Schleife. Allerdings werden vorher auch die anderen Werte ersetzt. Du siehst es aber nicht, weil Du ja $änderung in jedem Schleifendurchlauf mit der aktuellen Ersetztung in $string überschreibst und $string sich ja nie ändert.

                  viele Grüße

                  Axel

                  1. Hi,

                    und was soll das jetzt bedeuten? Wie kann ich mir den "fertigen" string anzeigen lassen?
                    Achso, sry für das $>ä<nderung

                    1. Hallo,

                      und was soll das jetzt bedeuten?

                      $string="Wert #EINS# und wert #ZWEI# und wert #DREI# oder doch wert #ZWEI# ?";
                      $array=array(
                        "#EINS#"=>"220",
                        "#ZWEI#"=>"260",
                        "#DREI#"=>"300"
                      );
                      foreach($array as $halter => $wert)
                      {
                         $aenderung=str_replace($halter,$wert,$string);
                      }
                        echo $aenderung;

                      Gehen wir die Schleife mal durch:
                      "#EINS#"=>"220"
                      $aenderung=str_replace("#EINS#","220",$string);
                      in $aenderung steht jetzt:
                      Wert 220 und wert #ZWEI# und wert #DREI# oder doch wert #ZWEI# ?
                      $string ändert sich nicht.

                      "#ZWEI#"=>"260"
                      $aenderung=str_replace("#ZWEI#","260",$string);
                      in $aenderung steht jetzt:
                      Wert #EINS# und wert 260 und wert #DREI# oder doch wert 260 ?
                      $string ändert sich nicht.

                      "#DREI#"=>"300"
                      $aenderung=str_replace("#DREI#","300",$string);
                      in $aenderung steht jetzt:
                      Wert #EINS# und wert #ZWEI# und wert 300 oder doch wert #ZWEI# ?
                      $string ändert sich nicht.

                      _Jetzt_ gibst Du $aenderung aus.

                      Wie kann ich mir den "fertigen" string anzeigen lassen?

                      Indem Du $string mit jeder Ersetztung so anpasst, dass es sich die jeweilige Ersetzung merkt.

                      $string="Wert #EINS# und wert #ZWEI# und wert #DREI# oder doch wert #ZWEI# ?";
                      $array=array(
                        "#EINS#"=>"220",
                        "#ZWEI#"=>"260",
                        "#DREI#"=>"300"
                      );
                      foreach($array as $halter => $wert)
                      {

                      $string=str_replace($halter,$wert,$string);

                      }
                        echo $string;

                      Wenn $string erhalten bleiben soll, muss die Hilfsvariable $aenderung _vor_ der Schleife den String übergeben bekommen und sich dann _in_ der Schleife wirklich jede Ersetzung merken.

                      $aenderung = $string;

                      foreach($array as $halter => $wert)
                      {

                      $aenderung=str_replace($halter,$wert,$aenderung);

                      }
                        echo $aenderung;

                      viele Grüße

                      Axel

                      1. Hey Axel,

                        super, vielen dank!

                        1. echo $begrüßung;

                          super, vielen dank!

                          Noch "superer" ist, dass PHP eine Funktion namens strtr() (nicht zu verwechseln mit strstr()) kennt, dessen zweite Aufrufvariante deine Schleife überflüssig macht.

                          Umlaute in Variablen- oder Funktionsnamen sind für PHP übrigens kein Problem. Dass einige deren Verwendung als schlechten Stil ansehen, ist deren Problem/Meinung :-)

                          echo "$verabschiedung $name";

                          1. Hallo,

                            Umlaute in Variablen- oder Funktionsnamen sind für PHP übrigens kein Problem. Dass einige deren Verwendung als schlechten Stil ansehen, ist deren Problem/Meinung :-)

                            Naja, spätestens wenn man das PHP-Script, der enthaltenen HTML-Inhalte wegen, als UTF-8 abspeichert, ist ein "ä" nicht mehr in
                            [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
                            enthalten.

                            Im Übrigen gibt es keine ASCII characters from 128 through 255. ASCII ist ein 7-bit Zeichensatz

                            viele Grüße

                            Axel

                            1. Hallo,

                              Naja, spätestens wenn man das PHP-Script, der enthaltenen HTML-Inhalte wegen, als UTF-8 abspeichert, ist ein "ä" nicht mehr in
                              [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
                              enthalten.

                              Bevor das jetzt als Argument kommt: Es "funzt" trotzdem, weil die Variable für PHP dann eben $änderung heißt.

                              viele Grüße

                              Axel

                              1. echo $begrüßung;

                                Naja, spätestens wenn man das PHP-Script, der enthaltenen HTML-Inhalte wegen, als UTF-8 abspeichert, ist ein "ä" nicht mehr in
                                [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
                                enthalten.
                                Bevor das jetzt als Argument kommt: Es "funzt" trotzdem, weil die Variable für PHP dann eben $änderung heißt.

                                Siehst du, also kein Problem. Da PHP bisher die Bytes eines Multi-Byte-UTF-8-Zeichens einzeln interpretiert, ist die Voraussetzung des RegExp-Ausdrucks erfüllt, denn diese Bytes befinden sich im Bereich \x80-\xFF.

                                echo "$verabschiedung $name";

    2. Hi,

      sorry, ausgabe:
      array(2) { ["Böse"]=>  string(5) "#BAD#" ["Lustig"]=>  string(5) "#LOL#" }

      alles richtig..