如何更改我的代码,以便它还能解决数学字符串表达式?

时间:2015-07-16 16:16:08

标签: php arrays string math

我想要下面的代码,它还解决了数学字符串表达式(/+-*)。

array_sum(array_column(array_intersect_key($lines, array_flip($keys)), 2));

就像现在一样,上面的代码忽略了数学问题,而是坚持总和。举个例子:

expenses|test-1|628
expenses|test-2|2348/2
expenses|test-3|379

使用上面的数组代码,总和将为3355。正确的金额为2181

要完全了解当前的代码行,请参阅我上一期提问的this answer

1 个答案:

答案 0 :(得分:0)

这应该适合你:

只需将此功能添加到您的代码中:

function calculateBasicMath($expression) {
    $expression = preg_replace("/[^0-9\+\-\*\/\.\,]/", "", $expression);

    while(preg_match("/(\d+)([\*\/])(\d+)/", $expression, $hM) || preg_match("/(\d+)([\+\-])(\d+)/", $expression, $lM)) {

        if(!empty($hM)) {

            switch($hM[2]){
                case "*":
                    $expression = str_replace("$hM[1]$hM[2]$hM[3]", $hM[1] * $hM[3], $expression);
                break;

                case "/":
                    $expression = str_replace("$hM[1]$hM[2]$hM[3]", $hM[1] / $hM[3], $expression);
                break;
            }

        } elseif(!empty($lM)) {

            switch($lM[2]){
                case "+":
                    $expression = str_replace("$lM[1]$lM[2]$lM[3]", $lM[1] + $lM[3], $expression);
                break;

                case "-":
                    $expression = str_replace("$lM[1]$lM[2]$lM[3]", $lM[1] - $lM[3], $expression);
                break;
            }

        } else {
            break;
        }

    }
    return $expression;
}

然后改变你的行:

array_sum(array_column(array_intersect_key($lines, array_flip($keys)), 2));

为:

array_sum(array_map("calculateBasicMath", array_column(array_intersect_key($lines, array_flip($keys)), 2)));
        //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ See here

因此它基本上为每个值调用此函数。

函数本身首先替换所有期望:[0-9]+-/*.,preg_replace()。然后它只是搜索基本数学,例如X[+-*/]X。但/*的优先级高于+-。只要它找到这样的数学表达式,它就会计算出来并替换它们。