String addieren
Chris Ross
- php
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
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
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
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
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
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
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
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
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.
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
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. ;)
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
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
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;');
eval('$ergebnis = '.$aufgabe.';'); // oder
eval("$ergebnis = $aufgabe;");
MfG ChrisB
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
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.