2010-12-02 2 views
0

配列キーで構成される式を処理する関数を記述したいと思います。たとえば、(1 + 3 + 5 + 7-8)* 9または(1-3 + 5)/ 6などです。PHPで配列キーで構成される式を処理する

EDIT: 私はフィールド(例えばA1 + A2-B2の*のB3)配列のキーと式フィールドという分野の一つである

+2

あなたの配列キーの1つが「(1 + 3 + 5 + 7-8)* 9」と言っていますか? – Mala

+0

なぜ?????????????????? –

+0

@Mala、申し訳ありませんが、より明確になっているはずです。数字のそれぞれは配列キーです。 – pistolshrimp

答えて

1
 


function convert_formula($formula, $formula_array) { 
    $callback = function($matches) use ($formula_array) {return $formula_array[(int) $matches[0]];}; 
    $converted = preg_replace_callback("/[0-9]+/", $callback, $formula); 
    return eval("return $converted;"); 
    } 

$test_formula = '(3-1) * (3-10)'; 
$test_formula_array = array(323,67,82,56, 10 => 3); 

echo convert_formula($test_formula, $test_formula_array); 



座標と、それは、Excelのグリッドと考える方が良いと思います

anon関数ではPHP 5.3。+が必要です。最初に$ formula引数を検証して、関数内で評価する前に数値と数学記号のみを受け入れるようにする必要があります。

編集:これは学生が数学を教えるためのツールであることを前提としています。既に参考になる数式があらかじめ組み込まれています... evalはPHPの最も危険な機能の1つで、おそらく、このクライアント側をjavascriptを使って実行することを検討するかもしれません。ページを構築するときは、数式で使用する可能性のあるすべての値を含む基本参照のJavaScript配列を動的に作成するだけです。このようにして、javascriptのeval関数を使用して、クライアントはすべて最終的に式を構築して解決します。最終的な評価はサーバーに渡され、評価が検証され、最終的な「正しい/間違った」応答が与えられます。ちょっと考えて...

+0

ありがとうございます。駆逐艦。それは素晴らしい作品です!私はeval悪を認識しており、javascriptの評価方法はまさに私が使用する予定だった。私はまだjs(まだ)に精通していないので、私はPHPで数式を取得することは私にとっては簡単だと思った。 – pistolshrimp

+0

@pistolshrimp:どうぞよろしくお願いいたします。変数を親スコープから関数のローカルスコープに自動的にインポートするための 'use'キーワードのような、この関数をjavascriptに移植するいくつかの問題があります。ここでは、ここで役立つjavascriptのanon関数に関する質問があります:http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work。また、 'preg_replace_callback'関数もないので、そこで回避策が必要です。 –

1

これは本当にうまくいきます。

$input = '0 + 1 + 2 + 3'; 
$input = preg_replace('/[^0-9\/\+\-\*]/', '', $input); 

$array = array(23, 40, 6, 200); 

function getAtIndex($i) { 
    global $array; 
    return isset($array[$i[0]]) ? $array[$i[0]] : 0; 
} 

$output = preg_replace_callback('/[0-9]+/', 'getAtIndex', $input); 

eval('$output = ' . $output . ';'); 

編集:入力が消去されます。

+0

ブロン:他の例が9を超えない場合でも、そのような 'str_replace'を使ってもかなり発明的でした。 –

+0

ブロン、ありがとう。私もこれを試してみます。 – pistolshrimp

+0

@ bob-the-destroyer:私はまだそれをテストしていないが、私はそう信じている。正規表現の '+'に注意してください。あなたはそれを試しましたか? – Jonah

関連する問題