You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何计算字符串形式数学表达式(5+10)-8+2*2得到结果11

PHP 字符串数学表达式计算实现方案

你当前的代码仅完成了表达式字符串的赋值与打印,没有触发计算逻辑,可通过以下两种方案实现直接输出计算结果:

  • 方案1:eval 实现(仅适合表达式完全内部可控、无外部用户输入的场景)
    eval 会将传入的字符串作为PHP代码直接执行,严禁传入未经过滤的用户输入内容,否则会引发严重的代码注入安全漏洞。
    实现代码:
    <?php
    $equation = "(5+10)-8+2*2";
    eval("\$calcResult = $equation;");
    echo $calcResult;
    // 运行输出:11
    
  • 方案2:自定义栈解析实现(生产环境推荐,无代码执行风险)
    基于栈结构实现四则运算+括号的优先级解析,不存在代码执行风险,可自动适配数学运算的优先级规则,你给出的表达式场景可直接使用以下代码:
    <?php
    function calcEquation(string $expr): int|float
    {
        $expr = str_replace(' ', '', $expr);
        $numStack = [];
        $opStack = [];
        $opPriority = ['+' => 1, '-' => 1, '*' => 2, '/' => 2];
        $strLen = strlen($expr);
        $currentNum = 0;
    
        for ($i = 0; $i < $strLen; $i++) {
            $char = $expr[$i];
            if (is_numeric($char)) {
                $currentNum = $currentNum * 10 + (int)$char;
                if ($i === $strLen - 1 || !is_numeric($expr[$i + 1])) {
                    array_push($numStack, $currentNum);
                    $currentNum = 0;
                }
            } elseif ($char === '(') {
                array_push($opStack, $char);
            } elseif ($char === ')') {
                while (end($opStack) !== '(') {
                    singleCalc($numStack, $opStack);
                }
                array_pop($opStack);
            } else {
                while (!empty($opStack) && end($opStack) !== '(' && $opPriority[end($opStack)] >= $opPriority[$char]) {
                    singleCalc($numStack, $opStack);
                }
                array_push($opStack, $char);
            }
        }
    
        while (!empty($opStack)) {
            singleCalc($numStack, $opStack);
        }
        return end($numStack);
    }
    
    function singleCalc(&$numStack, &$opStack)
    {
        $right = array_pop($numStack);
        $left = array_pop($numStack);
        $operator = array_pop($opStack);
        $res = match($operator) {
            '+' => $left + $right,
            '-' => $left - $right,
            '*' => $left * $right,
            '/' => $left / $right
        };
        array_push($numStack, $res);
    }
    
    // 调用测试
    $equation = "(5+10)-8+2*2";
    echo calcEquation($equation);
    // 运行输出:11
    

提示:如果需要支持幂运算、取模、数学函数等更复杂的计算逻辑,直接使用成熟的无执行风险的表达式解析组件即可,不要自行零散扩展解析逻辑,避免出现运算符优先级判断错误、括号匹配异常等问题。

内容的提问来源于stack exchange,提问作者MUHAMMED ELHALİL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:18:14