いくつかのカスタム数式を解析して計算するための良いアルゴリズムまたは少なくともコードの一部は何でしょうか?
例えば:
abs(add(subtract(5,10),abs(add(2,4))))
もう一つの例:
abs(add(add(2,6),subtract(7,multiply(-1,multiply(-1,5)))))
したがって、5-10 = -5 と評価され、次に 2 + 4 = 6 と評価されます。6 の絶対値はちょうど 6 です。次に、次の操作は -5 + 6 = 1 であり、その絶対値は 1 です。
そのため、eval() を使用せずにこのようなものを解析する解決策を見つけようとしています。
これが私がこれまでに試したことです。
$expr = "abs(add(subtract(5,10),abs(add(2,4))))";
$expr_array = preg_split("/(subtract\()/", $expr, NULL, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
foreach($expr_array as $key => $value) {
$value = preg_replace("/(\)|\()/", "", $value);
echo $value."\n";
}
これはレンダリングするだけです
absadd 減算 5,10,absadd2,4
ただし、それを解析し、それぞれの () 内のオペランドを区別するための優れた方法が必要です。フォーマットが同じならやりやすいです。
preg_split を使用して文字列を解析し、オペランド用と数値用に別の配列を作成することも考えましたが、数値の一部は abs(add(2,4) のような数値を含む実際のオペランドです。