2010-09-10 109 views
1

有一組用於計算一些值的簡單公式。 我需要爲web界面實現這個(我使用PHP製作)。式計算機構用於網絡

要存儲公式,我使用這樣的簡單格式:「X1 + X2 + X3」。當我需要做的計算,我稱之爲循環替換X1功能的preg_replace,X2 ..通過真實數據(由用戶輸入或更早版本保存的 - 這並不重要) 然後我用函數eval(「$ calculation_result =」。 $ trans_formula。';')其中$ trans_formula用替代數據存儲公式的文本。

這個機制看起來像一個原始的,我有一種感覺,我試圖重新發明輪子。也許有一些準備好的算法,技術和方法來完成這個?沒有必要的PHP代碼。即使簡單的算法描述,我也會感激。

+0

你絕對需要存儲的公式? – jrharshath 2010-09-10 15:26:52

+0

用戶應該有可能創建,存儲和計算他們自己的公式。在其他情況下,我很樂意爲每個公式計算使用硬編碼函數 – Andrew438 2010-09-10 15:52:00

+0

將eval()與用戶創建的內容結合在一起會造成麻煩! – Spudley 2010-09-10 16:05:43

回答

3

首先想到打我:eval是壞的!

我將如何處理這個問題:
1.我的formalue存放在後綴(波蘭記號) 2.然後我會寫一個簡單的程序來計算表達式。編寫後綴評估器相當容易。

如果需要,這種方法還可以讓您檢查值類型和範圍限制等內容。同時消除了eval的巨大風險。

乾杯!


編輯迴應這個問題您的評論:

如果您的用戶將進入自己的表情,你會想將它們轉換爲postfix的了。 Check out infix to postfix conversion

+0

即使我將公式存儲在波蘭語中,而不是使用一些phpclass來評估表達式,它仍然意味着該類將使用「eval」?我錯了嗎? – Andrew438 2010-09-10 15:49:17

+0

不,你不會使用「eval」。 http://scriptasylum.com/tutorials/infix_postfix/algorithms/postfix-evaluation/index.htm – jrharshath 2010-09-10 15:52:27

0

如果公式是預先確定的,因爲我想讀你的問題,它是無用的(更好,它是危險的)使用eval來評估它們。

創建簡單函數並調用它們傳遞適當的參數(輸入檢查後)。

例如,你的榜樣是:

<?php 
    function sumOfThree($x1, $x2, $x3) { 
    return $x1+$x2+$x3; 
    } 

// and you can call it as usual: 
$calculation_result = sumOfThree($first, $second, $third); 
?> 

你會得到很多的加

  • 速度:EVAL是執行(即使是簡單的功能)非常緩慢;
  • 調試:您可以調試你的功能(並得到正確的錯誤消息);
  • 安全爲Eval是很容易被利用。
+0

不幸的是,公式並未預先確定。用戶有可能創建自己的公式,我正在尋找存儲和解釋這些公式的最佳方式 – Andrew438 2010-09-10 15:44:07