Ankündigung

Einklappen
Keine Ankündigung bisher.

Mathematische Berechnung vom Stringinhalt

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mathematische Berechnung vom Stringinhalt

    Hi. Ich stehe vor einem Problem. Undzwar muss ich eine mathematische Berechnung von einem Stringinhalt durchführen. Folgendes habe ich schon versucht...

    PHP-Code:
    $test     =    "17+3";
    $test2    =    (int)$test;
    echo 
    $test ."<BR>"// Ausgabe  "17+4"
    echo $test2;  // Ausgabe  17 , hier soll jedoch 21 rauskommen 
    Irgendeiner eine Idee?


  • #2
    In einem String kannst du nicht rechnen.

    PHP-Code:
    $string '17+3';
    $array explode('+'$string);
    $result $array[0] + $array[1];
    echo 
    $result
    true||false - www.trueorfalse.de - Rund um Software Entwicklung

    Kommentar


    • #3
      Höchstens mit eval()
      PHP-Code:
      eval ('$a = 3+5;');
      echo 
      $a
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        EDIT: eval schau ich mir auch mal an...

        Danke für den Ansatz.
        Ich habe das nun so ähnlich gelöst.
        PHP-Code:
        <?php
        $zahl1    
        =    17;
        $zahl2    =    4;
        $aufgabe    =    (string)"$zahl1 + $zahl2";
        $losung        =    $zahl1 $zahl2;

        echo 
        $aufgabe ."<BR>";
        echo 
        $losung;
        ?>

        Kommentar


        • #5
          Da würd ich mir aber wirklich eher nen Parser zu schreiben, bevor ich da mit eval anfange. Ein simpler Parser für Grunrechenarten, Klammern und ein bißchen Potenzrechnung braucht da ja nicht viel mehr als 20 bis 30 Zeilen Code.

          Gruß Jens

          Kommentar


          • #6
            Parser basteln der dir das ganze in Tokens zerlegt und nen Interpreter der die Tokens dann passend interpretiert (dinge wie operatoren-gewichtung (Punkt vor Strich Rechnung, Klammerung, ... ), etc)

            alternativ der ganz unschöne und gefährliche weg, einen whitelistebasierten validator schreiben und dann das ganze als php-code via eval() ausführen, da solltest du aber nicht machen wenn das direkter user-input ist!!

            // damn ... wieder viel zu spät :P
            robo47.net - Blog, Codeschnipsel und mehr
            | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

            Kommentar


            • #7
              Zitat von Jens Clasen Beitrag anzeigen
              Da würd ich mir aber wirklich eher nen Parser zu schreiben, bevor ich da mit eval anfange. Ein simpler Parser für Grunrechenarten, Klammern und ein bißchen Potenzrechnung braucht da ja nicht viel mehr als 20 bis 30 Zeilen Code.

              Gruß Jens
              Dito das würd ich auch mal behaupten. Eval geht mal gar nicht.
              true||false - www.trueorfalse.de - Rund um Software Entwicklung

              Kommentar


              • #8
                Behaupten kann man vieles Ich war mir mit meiner eigenen Behauptung allerdings selbst grad nicht mehr so sicher - zumindest was die Anzahl der Zeilen angeht.

                Ich hab das ganze also mal ausgetestet:

                PHP-Code:
                <?php
                   
                function evaluate($str){
                      
                $stack=$v=array();
                      
                $v[0]=$v[1]=$op=null;
                      if(
                preg_match_all('#[ ()+*/^-]|(\-?\d+)#',$str,$m))
                        foreach(
                $m[0] as $tk)
                          switch(
                $tk){
                            case 
                '+': case '-': case '*': case '/': case '^'$op=$tk; break;          
                            case 
                '('array_push($stack,array($v[0],$v[1],$op));
                                      
                $v[0]=$v[1]=$op=null;
                                      break;
                            case 
                ')'$kResult=$v[0];
                                      list(
                $v[0],$v[1],$op)=array_pop($stack);
                                      
                $v[is_null($v[0])?0:1]=$kResult;
                                      
                $bracketMode=true;
                            default:  if(!
                $bracketMode)
                                        
                $v[is_null($op) && is_null($v[0])?0:1]=$tk;
                                      if(!
                is_null($v[1])){
                                        
                $v[0]=math($v[0],$v[1],$op);
                                        
                $op=$v[1]=null;
                                      }
                                      
                $bracketMode=false;
                                      break; 
                          }
                        return 
                $v[0];
                      }
                      function 
                math($v1,$v2,$op){
                        return ((
                $op=='+')*($v1+$v2))+(($op=='*')*($v1*$v2))+(($op=='/')*($v1/$v2))
                               +((
                $op=='-')*($v1-$v2))+(($op=='^')*pow($v1,$v2));
                      }

                  echo 
                evaluate('(7+9)+((9^2)/22)');
                ?>
                Mit Bescheißen gehen also wirklich 29 Zeilen Sollte man allerdings ein Fehlerhandling und Punkt-vor-Strich haben wollen, dann werdens wohl doch ne hand voll Zeilen mehr...

                Gruß Jens

                Kommentar


                • #9
                  Zitat von Jens Clasen Beitrag anzeigen
                  Sollte man allerdings ... Punkt-vor-Strich haben wollen, dann werdens wohl doch ne hand voll Zeilen mehr...
                  Wär schon gut... weil anderenfalls kann ich auch gleich Zufallszahlen ausspucken - die wären genauso richtig, wie falsch gerechnete Ergebnisse
                  Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                  Kommentar


                  • #10
                    Warum? Du kannst ja auch Klammern setzen.

                    Ist aber schon richtig - das war der Hauptbeschiss. Dazu müsst man allerdings immer erst die komplette Formel einlesen und kann nicht wärend des Lesens von links nach rechts durch rechnen. Das krieg ich nur in der einen verfügbaren Zeile nicht mehr unter...

                    Gruß Jens

                    Kommentar


                    • #11
                      Wie oft kommt dieses Thema noch?

                      Das Thema wurde bereits hinreichend behandelt. Bitte benutze die Forensuche und beachte diesen Thread!

                      [MOD: Thread geschlossen]
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar

                      Lädt...
                      X