Chris Ross: String addieren

Hallo Forum,

erst mal "Frohe Ostern" :))

Vielleicht kann mir ja jemand einen Tipp zu folgendem "Problem" geben:

Ich habe per preg_match usw. einen "fertigen" String aus einem sehr langen String erzeugt, der eigentlich nur noch "ausgeführt" werden muss: "4+2+0+0"

Schön wäre es, wenn ich diesen String per Umwandlung nach Int gleichzeitig ausrechnen lassen könnte, so nach der Art: intval($sting), was dann in diesem Fall 6 zurückgeben würde. Auch $test += $string; funzt nicht.

Gibts da ne Möglichkeit, sowas mit einem Handstreich zu lösen, oder muss ich das auf "umsändliche" Art errechnen?

Vielleicht kann mir ja jemand kurz aufs Pferd helfen .. :))

Schönen Oster-Montag noch

Gruß
Chris

  1. Hello,

    $aufgabe = "4+2+0+0";

    $ok = eval('$ergebnis = $aufgabe');

    if ($ok)
       {
          echo "$aufgabe = $ergebnis<br>\n";
       }

    Das _kann_ so funktionieren, ist aber nicht ungefährlich. Wenn in $aufgabe irgendwelche Hässlichkeiten drinstehen, werden die auch ausgeführt.

    Liebe Grüße

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    1. Das _kann_ so funktionieren, ist aber nicht ungefährlich. Wenn in $aufgabe irgendwelche Hässlichkeiten drinstehen, werden die auch ausgeführt.

      Hallo Tom,

      ne, das klappt leider nicht wie gewollt. Hab's jetzt auf die "herkömmliche" gelöst" :))

      Trotzdem Dank an Dich.

      Gruß
      Chris

    2. Hello,

      Hello,

      $aufgabe = "4+2+0+0";

      $ok = eval('$ergebnis = $aufgabe;');   ## es fehlte noch ein Semikolon

      if ($ok)
         {
            echo "$aufgabe = $ergebnis<br>\n";
         }

      Das _kann_ so funktionieren, ist aber nicht ungefährlich. Wenn in $aufgabe irgendwelche Hässlichkeiten drinstehen, werden die auch ausgeführt.

      Es fehlte noch ein Semikolon.
      Aber es funktioniert so auch nicht.
      Der Inhalt von $aufgabe wird immer als String angesehen von eval().
      Es fällt mir im Moment auch nicht ein, wie ich das mal gelöst hatte.
      Kann aber sein, dass es gar nicht funktionierte und ich eine eigene Funktion für die vier Grundrechenaarten gebaut habe (Stichwort "polnische Notation").

      Liebe Grüße

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      1. Hello,

        Kann aber sein, dass es gar nicht funktionierte und ich eine eigene Funktion für die vier Grundrechenaarten gebaut habe (Stichwort "polnische Notation").

        Muss so sein, dass ich das selbst programmiert hatte.
        http://de.wikipedia.org/wiki/Umgekehrte_Polnische_Notation#Mathematische_Grundlage

        Leider weiß ich aus dem Kopf nicht mehr, wie es ging.
        Aus dem String wurden mittels zwei (?) Stacks die Operanden von den Operatoren getrennt und dann wieder zur polnischen Notation zusammengebaut. Die kann man dann einfach von links nach rechts auswerten...

        So eine Funktion findet man bei genügend langem Suchen für PHP garantiert auch im Netz, zumindest für die vier Grundrechenarten nebst drei Klammerarten.

        Liebe Grüße

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        1. Hello,

          So eine Funktion findet man bei genügend langem Suchen für PHP garantiert auch im Netz, zumindest für die vier Grundrechenarten nebst drei Klammerarten.

          Ich habe sie gefunden, aber auf meinem eigenen Server in Pascal. Kann die vier Grundrechnenarten und Ptotenzierung, sowie drei Klammertypen.

          Das umzubauen in PHP ist sicherlich nicht schwer, aber trotzdem gar nicht so unaufwändig. Es sind 385 Zeilen Pascal-Code (Unit-Konzept). In PHP müsste man zweckmäßigerweise eine Klasse daraus machen.

          Ich werde mich mal damit beschäftigen, denn die Frage kommt doch öfter.
          Sollte vor Mittwoch jemand was fertiges finden, wär's nett, wenn er hier einen Link postete.

          Liebe Grüße

          Tom vom Berg

          --
          Nur selber lernen macht schlau
      2. Hi,

        $aufgabe = "4+2+0+0";

        $ok = eval('$ergebnis = $aufgabe;');   ## es fehlte noch ein Semikolon

        Es fehlte noch ein Semikolon.
        Aber es funktioniert so auch nicht.
        Der Inhalt von $aufgabe wird immer als String angesehen von eval().

        eval('$ergebnis = '.$aufgabe.';');

        MfG ChrisB

        1. Hello,

          eval('$ergebnis = '.$aufgabe.';');

          Tatsächlich!

          Habe ich kurz davor gedacht, dass das ja Quatsch wäre...
          Aber Eval() ist ja auch keine Funktion, sondern ein Parser-Konstrukt.

          Gefährlich ist es trotzdem, hier Werte von außen einzubringen.

          Liebe Grüße

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          1. Tach.

            eval('$ergebnis = '.$aufgabe.';');

            Tatsächlich!

            Habe ich kurz davor gedacht, dass das ja Quatsch wäre...
            Aber Eval() ist ja auch keine Funktion, sondern ein Parser-Konstrukt.

            Was auch immer eine Funktion von einem "Parser-Konstrukt" unterscheidet ...

            Der springende Punkt ist einfach, daß $ergebnis in doppelten Anführungszeichen als Variable gewertet wird, und das ist in diesem Fall nicht gewollt. Alternativ kann man auch

            eval("\$ergebnis = $aufgabe;");

            schreiben.

            Gefährlich ist es trotzdem, hier Werte von außen einzubringen.

            Ja, wenn das ungeprüft geschieht. Wenn der reguläre Ausdruck zum Finden der "Aufgabenzeichenkette" was taugt, stellt er ja sicher, daß das richtige verarbeitet wird.

            --
            Once is a mistake, twice is Jazz.
            1. Hi,

              eval('$ergebnis = '.$aufgabe.';');

              Tatsächlich!

              Habe ich kurz davor gedacht, dass das ja Quatsch wäre...
              Aber Eval() ist ja auch keine Funktion, sondern ein Parser-Konstrukt.

              Was auch immer eine Funktion von einem "Parser-Konstrukt" unterscheidet ...

              Der springende Punkt ist einfach, daß $ergebnis in doppelten Anführungszeichen als Variable gewertet wird, und das ist in diesem Fall nicht gewollt.

              Auch Tom hatte in seiner Version

              $ok = eval('$ergebnis = $aufgabe;');

              keine doppelten Anfuehrungszeichen - und die "funzte" trotzdem nicht.

              Der Unterschied ist einfach, dass wenn ich eval('$ergebnis = $aufgabe;'); verwende, wird da im String $ausgabe noch nicht durch seinen Inhalt ersetzt - so dass das eval dann nach wie vor den Code $ergebnis = $ausgabe ausfuehrt, d.h. $ergebnis enthaelt danach den gleichen Textinhalt wie $ausgabe.

              MfG ChrisB

              1. Tach.

                Auch Tom hatte in seiner Version

                $ok = eval('$ergebnis = $aufgabe;');
                keine doppelten Anfuehrungszeichen - und die "funzte" trotzdem nicht.

                Stimmt. Ich hab nach dem Lesen der Beiträge nicht nochmal zu Toms Beitrag gescrollt und mich dann falsch erinnert. Es gibt ja (bezogen auf die unterschiedlichen Anführungsstriche) zwei Varianten, es falsch zu schreiben. ;)

                --
                Once is a mistake, twice is Jazz.
                1. Hello,

                  Auch Tom hatte in seiner Version

                  $ok = eval('$ergebnis = $aufgabe;');
                  keine doppelten Anfuehrungszeichen - und die "funzte" trotzdem nicht.

                  Stimmt. Ich hab nach dem Lesen der Beiträge nicht nochmal zu Toms Beitrag gescrollt und mich dann falsch erinnert. Es gibt ja (bezogen auf die unterschiedlichen Anführungsstriche) zwei Varianten, es falsch zu schreiben. ;)

                  und eval() ist sozusagen noch die dritte Möglichkeit.
                  der resultierende Text wird an die Stelle im Script eingestanzt, an der eval() steht und dann erst "normal" geparst.

                  Liebe Grüße

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
              2. Hello,

                eval('$ergebnis = '.$aufgabe.';');

                Auch Tom hatte in seiner Version

                $ok = eval('$ergebnis = $aufgabe;');
                keine doppelten Anfuehrungszeichen - und die "funzte" trotzdem nicht.

                Der Unterschied ist einfach, dass wenn ich eval('$ergebnis = $aufgabe;'); verwende, wird da im String $ausgabe noch nicht durch seinen Inhalt ersetzt - so dass das eval dann nach wie vor den Code $ergebnis = $ausgabe ausfuehrt, d.h. $ergebnis enthaelt danach den gleichen Textinhalt wie $ausgabe.

                Das ist genau DIE Frage bei eval(), wann was ersetzt wird und wann die automatische Typumwandlung greift, und wann nicht.

                Liebe Grüße

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                1. Hi,

                  Das ist genau DIE Frage bei eval(), wann was ersetzt wird und wann die automatische Typumwandlung greift, und wann nicht.

                  Was ist unklar? Fuer mich stellt es sich ganz simpel so dar:

                  eval(irgendwas) ist ein Funktionsaufruf wie jeder andere auch.
                  Erst mal wird irgendwas als Ausdruck ausgewertet, und dann von der Funktion verarbeitet.

                  eval('$ergebnis = $aufgabe;');

                  • der Ausdruck '$ergebnis = $aufgabe;' ergibt auch nach seiner Auswertung nach wie vor nur das Textliteral mit dem Inhalt $ergebnis = $aufgabe; - und wenn dieser Code ausgefuehrt wird, egal ob nun von eval oder nicht, dann erhaelt $ergebnis den Inhalt von $ausgabe, Bummsausfertig.

                  eval('$ergebnis = '.$aufgabe.';'); // oder
                  eval("$ergebnis = $aufgabe;");

                  • hier ergibt der ausgewertete Ausdruck $ergebnis = 4+2+0+0; - und wenn das dann vom Parser ausgefuehrt wird, findet tatsaechlich eine Berechnung statt.

                  MfG ChrisB

                  1. Hello Chris,

                    gut und verständlich erklärt!
                    Wenn jetzt jemand später im Archiv danach sucht, kann er/sie es bestimmt sogar verstehen ;-)

                    Diese explizite allgemeinverständliche Erklärung wird häufig vergessen, wenn eine Frage so leidlich beantwortet wurde und es "funzt"...

                    Liebe Grüße

                    Tom vom Berg

                    --
                    Nur selber lernen macht schlau
                2. Tach.

                  Das ist genau DIE Frage bei eval(), wann was ersetzt wird und wann die automatische Typumwandlung greift, und wann nicht.

                  eval macht nichts anders als PHP an sich. In doppelten Anführungszeichen werden $Zeichenketten als Variablenbezeichner interpretiert und entsprechend substituiert. In einfachen Anführungszeichen nicht. Den resultierenden String erhält eval als Argument und interpretiert ihn so, als hättest Du ihn in dieser Form in den Quelltext geschrieben.

                  --
                  Once is a mistake, twice is Jazz.