質問

文字列として与えられた方程式を取得し、数学的な答えを見つける方法が必要です。大きな注意点は、eval()を使用できないことです。

方程式には数字、4つの数学演算子(* / +-)、括弧のみが含まれることがわかっていますが、文字列にスペースが含まれていても含まれていなくてもかまいません。以下にいくつかの例を示します。

4 * 4
4+6/3
(3 / 2)*(4+8)
(4+8) * 2

何らかの正規表現を使用して行う必要があると思いますか?

役に立ちましたか?

解決

数式は規則的ではありません。これらは context-free です。

最善の策は、シャンティングヤードアルゴリズムのような有名な数学解析アルゴリズムを使用して解析することです。 >。心配する必要があるのは、PHPでアルゴリズムを実装することだけです。それのPHP実装をオンラインで見つけることさえできるかもしれません。

他のヒント

ここで興味がある人が逆ポーランド記法を生成するためにPHPで思いついたアルゴリズムである場合に備えて

function convertToRPN($equation)

{
    $equation = str_replace(' ', '', $equation);
    $tokens = token_get_all('<?php ' . $equation);
    $operators = array('*' => 1, '/' => 1, '+' => 2, '-' => 2);
    $rpn = '';
    $stack = array();
    $size = count($tokens);                                                 
    for($i = 1; $i < $size; $i++) {
        if(is_array($tokens[$i])) {
            $rpn .= $tokens[$i][1] . ' ';
        } else {
            if(empty($stack) || $tokens[$i] == '(') {
                $stack[] = $tokens[$i];
            } else {
                if($tokens[$i] == ')') {
                    while(end($stack) != '(') {
                        $rpn .= array_pop($stack);
                    }
                    array_pop($stack);
                } else {
                    while(!empty($stack) && end($stack) != '(' && $operators[$tokens[$i]] >= $operators[end($stack)]) {
                        $rpn .= array_pop($stack);
                    }
                    $stack[] = $tokens[$i];
                }
            }
        }
    }

    while(!empty($stack)) {
        $rpn .= array_pop($stack);
    }

    return $rpn;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top