亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Inhaltsverzeichnis
2. Parsing with Shunting Yard Algorithm (Convert to RPN)
3. Evaluating the RPN Expression
4. Putting It All Together
5. Usage Example
Key Features & Benefits
Possible Enhancements
Heim Backend-Entwicklung PHP-Tutorial Implementierung eines benutzerdefinierten mathematischen Ausdrucks Parser und Evaluator in PHP

Implementierung eines benutzerdefinierten mathematischen Ausdrucks Parser und Evaluator in PHP

Jul 31, 2025 pm 12:43 PM
PHP Math

答案是:通過分步實(shí)現(xiàn)詞法分析、Shunting Yard算法解析和RPN求值,可構(gòu)建安全可控的PHP數(shù)學(xué)表達(dá)式求值器。1. tokenize函數(shù)將輸入拆分為數(shù)字、變量、操作符等標(biāo)記;2. parseToRPN使用Shunting Yard算法按優(yōu)先級和結(jié)合性轉(zhuǎn)換為逆波蘭表示;3. evaluateRPN利用棧結(jié)構(gòu)結(jié)合變量上下文計(jì)算結(jié)果;4. evaluateExpression整合流程并處理異常;5. 示例顯示支持變量和標(biāo)準(zhǔn)運(yùn)算,具備安全性、可擴(kuò)展性與錯誤處理能力,適用于需避免eval()風(fēng)險(xiǎn)的場景。

Implementing a Custom Mathematical Expression Parser and Evaluator in PHP

Creating a custom mathematical expression parser and evaluator in PHP can be useful when you need more control than eval() provides—especially for security, extensibility, or educational purposes. While eval() can execute expressions, it's dangerous with untrusted input and lacks flexibility. Building your own parser allows you to safely evaluate expressions like 2 + 3 * (4 - 1) while supporting variables, functions, and error handling.

Implementing a Custom Mathematical Expression Parser and Evaluator in PHP

Here’s how to implement a simple yet effective mathematical expression parser and evaluator in PHP.


1. Tokenization: Breaking the Input into Meaningful Parts

The first step is to convert the input string into tokens—numbers, operators, parentheses, variables, and functions.

Implementing a Custom Mathematical Expression Parser and Evaluator in PHP
function tokenize($expression) {
    $tokens = [];
    $length = strlen($expression);
    $i = 0;

    while ($i < $length) {
        $char = $expression[$i];

        if (ctype_digit($char) || $char === '.') {
            $num = '';
            while ($i < $length && (ctype_digit($expression[$i]) || $expression[$i] === '.')) {
                $num .= $expression[$i++];
            }
            $tokens[] = ['type' => 'number', 'value' => (float)$num];
            $i--;
        } elseif (ctype_alpha($char)) {
            $var = '';
            while ($i < $length && ctype_alnum($expression[$i])) {
                $var .= $expression[$i++];
            }
            $tokens[] = ['type' => 'variable', 'value' => $var];
            $i--;
        } elseif (in_array($char, ['+', '-', '*', '/', '^', '(', ')'])) {
            $tokens[] = ['type' => 'operator', 'value' => $char];
        } elseif ($char === ' ') {
            // Skip whitespace
        } else {
            throw new Exception("Unknown character: $char");
        }
        $i++;
    }

    return $tokens;
}

This tokenizer handles numbers (including decimals), variables (like x, y1), operators, and parentheses.


2. Parsing with Shunting Yard Algorithm (Convert to RPN)

We’ll use the Shunting Yard algorithm by Edsger Dijkstra to convert infix notation (standard math) to Reverse Polish Notation (RPN), which is easier to evaluate.

Implementing a Custom Mathematical Expression Parser and Evaluator in PHP
function parseToRPN($tokens) {
    $output = [];
    $operators = [];
    $precedence = ['+' => 1, '-' => 1, '*' => 2, '/' => 2, '^' => 3];
    $associativity = ['+' => 'left', '-' => 'left', '*' => 'left', '/' => 'left', '^' => 'right'];

    foreach ($tokens as $token) {
        if ($token['type'] === 'number' || $token['type'] === 'variable') {
            $output[] = $token;
        } elseif ($token['value'] === '(') {
            $operators[] = $token;
        } elseif ($token['value'] === ')') {
            while (!empty($operators) && end($operators)['value'] !== '(') {
                $output[] = array_pop($operators);
            }
            array_pop($operators); // Remove '('
        } elseif ($token['type'] === 'operator') {
            $op = $token['value'];
            while (
                !empty($operators) &&
                ($top = end($operators))['value'] !== '(' &&
                isset($precedence[$top['value']]) &&
                (
                    ($associativity[$op] === 'left' && $precedence[$op] <= $precedence[$top['value']]) ||
                    ($associativity[$op] === 'right' && $precedence[$op] < $precedence[$top['value']])
                )
            ) {
                $output[] = array_pop($operators);
            }
            $operators[] = $token;
        }
    }

    while (!empty($operators)) {
        $output[] = array_pop($operators);
    }

    return $output;
}

This algorithm respects operator precedence and associativity (e.g., ^ is right-associative).


3. Evaluating the RPN Expression

Now evaluate the RPN using a stack. Variables are resolved from a provided context (e.g., ['x' => 5]).

function evaluateRPN($rpn, $variables = []) {
    $stack = [];

    foreach ($rpn as $token) {
        if ($token['type'] === 'number') {
            $stack[] = $token['value'];
        } elseif ($token['type'] === 'variable') {
            if (!isset($variables[$token['value']])) {
                throw new Exception("Undefined variable: " . $token['value']);
            }
            $stack[] = $variables[$token['value']];
        } elseif ($token['type'] === 'operator') {
            if (count($stack) < 2) {
                throw new Exception("Invalid expression");
            }
            $b = array_pop($stack);
            $a = array_pop($stack);
            switch ($token['value']) {
                case '+': $stack[] = $a + $b; break;
                case '-': $stack[] = $a - $b; break;
                case '*': $stack[] = $a * $b; break;
                case '/': 
                    if ($b == 0) throw new Exception("Division by zero");
                    $stack[] = $a / $b; 
                    break;
                case '^': $stack[] = pow($a, $b); break;
                default: throw new Exception("Unknown operator: " . $token['value']);
            }
        }
    }

    if (count($stack) !== 1) {
        throw new Exception("Invalid expression");
    }

    return $stack[0];
}

4. Putting It All Together

Now create a simple wrapper function:

function evaluateExpression($expression, $variables = []) {
    try {
        $tokens = tokenize($expression);
        $rpn = parseToRPN($tokens);
        return evaluateRPN($rpn, $variables);
    } catch (Exception $e) {
        return "Error: " . $e->getMessage();
    }
}

5. Usage Example

echo evaluateExpression("2 + 3 * (4 - 1)"); // Output: 11
echo evaluateExpression("x + y * 2", ['x' => 5, 'y' => 3]); // Output: 11
echo evaluateExpression("z ^ 2", ['z' => 4]); // Output: 16

Key Features & Benefits

  • Safe: No use of eval(), so no code injection.
  • Extensible: You can add functions (e.g., sin, sqrt) by extending the tokenizer and evaluator.
  • Error Handling: Clear messages for undefined variables, syntax issues, or division by zero.
  • Supports Variables: Useful for dynamic expressions in forms, calculators, or rule engines.

Possible Enhancements

  • Support for built-in math functions (e.g., sin(x)).
  • Unary operators (e.g., -5, +3).
  • Better error recovery and syntax validation.
  • Custom operator definitions.

Building your own parser gives deep insight into how programming languages and calculators work. While tools like eval() or external libraries exist, a custom parser offers control, safety, and learning value.

Basically, it's not complex once you break it down—tokenize, parse, evaluate.

Das obige ist der detaillierte Inhalt vonImplementierung eines benutzerdefinierten mathematischen Ausdrucks Parser und Evaluator in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erkl?rung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Hei?e KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?e Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Navigieren durch die Fallstricke der Schwimmpunkt-Ungenauigkeit in PHP Navigieren durch die Fallstricke der Schwimmpunkt-Ungenauigkeit in PHP Jul 29, 2025 am 05:01 AM

Schwimmpunktzahlen sind ungenau, ist ein h?ufiges Problem in PHP. Die Antwort ist, dass es das IEEE754-Doppelprezisionsformat verwendet, wodurch Dezimaldezimalstellen nicht genau dargestellt werden k?nnen. Zahlen wie 1,0.1 oder 0,2 sind in bin?rer Dezimalstellen in unendlichen Schleifen, und der Computer muss sie abschneiden, um Fehler zu verursachen. 2. Beim Vergleich der schwimmenden Punktzahlen sollten Sie Toleranz anstelle von == verwenden, wie z. B. ABS ($ A- $ B)

Die Nuancen der numerischen Pr?zision: `Round ()`, `ceil ()` und `floor ()` Fallstricke Die Nuancen der numerischen Pr?zision: `Round ()`, `ceil ()` und `floor ()` Fallstricke Jul 29, 2025 am 04:55 AM

Round () verwendet "Roundhalftoeven", nicht "Roundhalfup", Egound (2,5) kehrt 2Andround (3,5) zurück

Die Rolle der modularen Arithmetik in PHP für kryptografische Anwendungen Die Rolle der modularen Arithmetik in PHP für kryptografische Anwendungen Jul 30, 2025 am 12:17 AM

ModulararithmeticisessentialinphpcryptographicApplicationsDespitePhpnotBeingahigh-Performancelanguage;

Grundlagen der Vektormathematik für 2D/3D -Grafiken in PHP Grundlagen der Vektormathematik für 2D/3D -Grafiken in PHP Jul 29, 2025 am 04:25 AM

AvectorInphpgraphics Repr?sentation, Direktion, orvelocityuseusing -LikeVector3DWitHX, Y, Zcomponents.2.Basicoperationssintenadaddition, Subtraktion, Skalarmultiplikation und DivisionFormovement und scaling.3.magnitudisiscalcululedviaThePythagorememem, a

Beschleunigung der gro?en Anzahl Arithmetik: Ein tiefes Eintauchen in die GMP -Erweiterung von PHP Beschleunigung der gro?en Anzahl Arithmetik: Ein tiefes Eintauchen in die GMP -Erweiterung von PHP Jul 29, 2025 am 04:53 AM

GmpiSessentialForHandlinglargeIntensinphpbeyondnatelimits.1.gmpenablesalbitrary-PrecisionIntegerarithMeticuseptimizedClibrary, UnliereneDinteGerSthatoverfloworbcmaththatisslower und Basis.2. UseGmpforheAntiereGeGeGeGeGerationSlikinials LikeFactoriorials

Mastering -Zahlensysteme: Fortgeschrittene Basisumwandlungstechniken in PHP Mastering -Zahlensysteme: Fortgeschrittene Basisumwandlungstechniken in PHP Jul 30, 2025 am 02:33 AM

Um die Bin?rkonvertierungsfunktionen in PHP zu verbessern, müssen Sie zun?chst benutzerdefinierte Bin?rkonvertierungsfunktionen implementieren, um mehr als 36% der Ziffern und benutzerdefinierten Zeichens?tze zu unterstützen. 1. Verwenden Sie Tobase und FromBase -Funktionen in Kombination mit benutzerdefinierten Ziffern Arrays, um eine willkürliche bin?re Umwandlung zu realisieren. 2. Bei der Verarbeitung gro?er Zahlen sollten Sie die von BCMath erweiterten BCComp-, BCMOD- und BCDIV -Funktionen verwenden, um die Genauigkeit zu gew?hrleisten. 3.. Erstellen Sie die BasisEncoder -Klasse, um die bidirektionale Sicherheitszuordnung zu implementieren, um eine reversible Codierung und Dekodierung sicherzustellen. 4. überprüfen Sie immer die Eingabe und vereinen Sie die Charakterreihenfolge. 5. Vermeiden Sie die Verwendung von Base_Convert, um gro?e Zahlen zu verarbeiten, und priorisieren Sie die GMP, um die Leistung zu verbessern, und realisieren letztendlich ein robustes und erweiterbares Bin?rkonvertierungssystem.

Erstellen eines statistischen Analyse -Toolkits: Mittelwert, Median und Standardabweichung in PHP Erstellen eines statistischen Analyse -Toolkits: Mittelwert, Median und Standardabweichung in PHP Jul 30, 2025 am 05:17 AM

Berechnen Sie den Mittelwert: Verwenden Sie Array_Sum (), um die Anzahl der Elemente zu teilen, um den Mittelwert zu erhalten. 2. Berechnen Sie den Median: Nehmen Sie nach der Sortierung den Zwischenwert und nehmen Sie den Durchschnitt der beiden Zwischenzahlen, wenn es sogar Elemente gibt. 3. Berechnen Sie die Standardabweichung: Ermitteln Sie zuerst den Mittelwert, berechnen Sie dann den Durchschnitt der quadratischen Differenz zwischen jedem Wert und dem Mittelwert (die Probe ist n-1) und nehmen Sie schlie?lich die Quadratwurzel; Durch die Einkapselung dieser drei Funktionen k?nnen grundlegende statistische Instrumente konstruiert, geeignet für die Analyse kleiner und mittelgro?er Daten geeignet sind und auf die Verarbeitung leerer Arrays und nicht numerischer Eingaben achten und schlie?lich die statistischen Kernmerkmale der Daten erkennen, ohne sich auf externe Bibliotheken zu verlassen.

Rechenleistung freischalten: Faktorien und Fibonacci mit dem GMP von PHP Rechenleistung freischalten: Faktorien und Fibonacci mit dem GMP von PHP Jul 29, 2025 am 04:37 AM

GmpiSessentialForHandlingLargenumberphpThatexceStandardIntegerlimits, SuchasinfactorialandfibonaccicalCulations, wobei 1ItenableSalbitrary-PrecisionarithMeticforcurateresults;

See all articles