Shunting Yard Implementierung in PHP benötigt, interpretiere und parse einen String, führe einen mathematischen Vergleich durch und gebe ein boolesches Ergebnis zurück

Ich bin auf der Suche nach etwas, das einen String in PHP interpretieren und einfache mathematische Berechnungen durchführen kann, und gebe dann ein boolesches Ergebnis zurück, um festzustellen, ob der Ausdruck wahr oder falsch ist.

Beispielsweise

Sue gibt "3 * {mysalary} / 9 = 10000" einPHP teilt dies in zwei Ausdrücke auf - explode ('=', string);PHP nimmt meine Liste der Datenbankfelder und ersetzt alle durch "{}" getrennten Felder durch die Daten (typecasted to int)PHP wertet dann den mathematischen Ausdruck @ aphp vergleicht dann die linke Seite mit der rechten Seiteboolean Ergebnis erzeugt.

s mag komplex klingen, aber es muss nur sehr einfach sein. Hier sind die Einschränkungen: 1 / mathematische Operatoren sind festgelegt auf: + - / * 2 / Vergleichsoperatoren sind festgelegt auf: => <> = <= 3 / keine Gleitkommavergleiche erforderlich, alles kann auf ganzzahliger Ebene durchgeführt werden. So können beliebige Divisionen bei Bedarf gerundet werden oder einfach nur das Endergebnis runden

Es gibt immer nur zwei Ausdrücke mit einem Vergleichsoperator. Wenn es überhaupt einen Fehler gibt, geben wir einfach false zurück.

Hat jemand etwas gesehen, das das schon kann? Ich weiß, dass ich etwas machen kann, aber warum das Rad neu erfinden, oder?

Wenn du nichts gesehen hast, ist es dir wichtig, ein paar "Fallstricke" oder Vorbehalte aufzulisten, die dir beim Erstellen einfallen.

Nachdem ich etwas mehr gelesen habe, wurde mir klar, dass ich das @ benutzen könnt Rangierbahnhof-Algorithmus. Hat jemand eine Implementierung davon in PHP?

Ich bin mir bewusst, dass eval eine einfache Methode ist, um dies durchzuführen. Ich bin jedoch besorgt, dass der Benutzer mit dieser Methode sehr leicht etwas kaputt machen oder Syntaxfehler verursachen kann. Ich würde es lieber nicht in die Lösung aufnehmen, oder wenn ja, müsste es genau kontrollieren, wie es verwendet wird.

Vielen Dank

Jason

Antworten auf die Frage(8)

Ihre Antwort auf die Frage