2016-10-22 9 views
1

私はそれを行うための基本的な単純な機能が必要です。ここで PHPの数式方程式(BODMAS)を評価するには?

は私の試みです:

function parseEq($eq) { 
    $char = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; 
    $achar = array_map('ord', $char); 

    $eq = str_replace($char, $achar, $eq); 

    return eval(strtr('return {eq};', [ 
     '{eq}' => strtr($eq, [ 
      '=' => '==', 
     ]) 
    ])); 
} 

が、これは唯一のいくつかの例のために働く:

var_dump(parseEq('2x = 2x')); 
var_dump(parseEq('a + b = b + a')); 
var_dump(parseEq('x - x = 0')); 
var_dump(parseEq('y/2 = (1/2)*y')); 
var_dump(parseEq('-(-x) = x')); 

ではなく、これらの2

var_dump(parseEq('2(x + y) = 2x + 2y')); 
var_dump(parseEq('2x = 2*x')); 

答えて

1
<?php 
function parseEq($eq) { 
     $char = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; 
     $achar = array_map('ord', $char); 

     // debug 
     echo $eq . PHP_EOL; 

     $eq = str_replace($char, $achar, $eq); 

     // debug 
     echo $eq . PHP_EOL; 

     return eval(strtr('return {eq};', [ 
       '{eq}' => strtr($eq, [ 
         '=' => '==', 
       ]) 
     ])); 
} 

ため

が生成されます10
2x = 2x 
2120 = 2120 
bool(true) 
a + b = b + a 
97 + 98 = 98 + 97 
bool(true) 
x - x = 0 
120 - 120 = 0 
bool(true) 
y/2 = (1/2)*y 
121/2 = (1/2)*121 
bool(true) 
-(-x) = x 
-(-120) = 120 
bool(true) 
2(x + y) = 2x + 2y 
2(120 + 121) = 2120 + 2121 
PHP Parse error: syntax error, unexpected '(' in parseEq.php(16) : eval()'d code on line 1 
bool(false) 
2x = 2*x 
2120 = 2*120 
bool(false) 

ので、それにそれぞれの文字を置換しようとしていることは、それは

2x = 2x 
    2*x = 2*x 
    2*120 = 2*120 
    bool(true) 
    a + b = b + a 
    a + b = b + a 
    97 + 98 = 98 + 97 
    bool(true) 
    x - x = 0 
    x - x = 0 
    120 - 120 = 0 
    bool(true) 
    y/2 = (1/2)*y 
    y/2 = (1/2)*y 
    121/2 = (1/2)*121 
    bool(true) 
    -(-x) = x 
    -(-x) = x 
    -(-120) = 120 
    bool(true) 
    2(x + y) = 2x + 2y 
    2*(x + y) = 2*x + 2*y 
    2*(120 + 121) = 2*120 + 2*121 
    bool(true) 
    2x = 2*x 
    2*x = 2*x 
    2*120 = 2*120 
    bool(true) 

を生成するいくつかの変更

<?php 
function parseEq($eq) { 
    $char = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; 
    $achar = array_map('ord', $char); 

    echo $eq . PHP_EOL; 

    // replaceing 2(or 2x with 2* or 2*x 
    $eq = preg_replace('/(\d+)([\(a-z])/', "$1*$2", $eq); 
    echo $eq . PHP_EOL; 

    $eq = str_replace($char, $achar, $eq); 

    echo $eq . PHP_EOL; 

    return eval(strtr('return {eq};', [ 
     '{eq}' => strtr($eq, [ 
      '=' => '==', 
     ]) 
    ])); 
} 

で120

へのxのようなので、それは今働いている普通の値です

+0

これは素晴らしいことです...力をやるのはどうですか? ^(x^2)*(x^3)= x^5'' – user2707590

+0

http://php.net/manual/en/function.pow.phpのように、^を**に置き換えるとうまくいくはずですPHP 5.6以降)。 preg_replaceを使ってx^5をpow(x、5)に変更できます。 – Richard