2014-10-08 38 views
0

根據用戶輸入,我執行查詢,然後對結果進行一些數學運算。我的問題是,我將數學存儲在一個變量中,無法將其作爲數學讀取。例如:php - 使用變量作爲公式

$Math=($ArryDBs[$i]['GSE45728_01']+$ArryDBs[$i]['GSE45728_02'])//this is constructed upon user input 

echo "<table>";//this is coded after Select, where $ArryDBs is generated 
    for ($i=0; $i<$num_rows; $i++){ 
    echo "<tr>"; 
     echo "<td> 1) From Math: ".$Math."</td>"; 
     echo "<td> 2) Direct: ".($ArryDBs[$i]['GSE45728_01']+$ArryDBs[$i]['GSE45728_02'])."</td>"; 
    echo "</tr>"; 
    } 
echo "</table>"; 

輸出如下(注意,表達式1)和2)是相同的):

1) From Math: ($ArryDBs[$i]['GSE45728_01']+$ArryDBs[$i]['GSE45728_02']) 2) Direct: 8.23018 
1) From Math: ($ArryDBs[$i]['GSE45728_01']+$ArryDBs[$i]['GSE45728_02']) 2) Direct: 12.46399 
1) From Math: ($ArryDBs[$i]['GSE45728_01']+$ArryDBs[$i]['GSE45728_02']) 2) Direct: 15.08906 

值2)直接就是我想要的。但它根據用戶輸入而改變。這就是爲什麼我將表達式存儲在變量中。它從字面上讀取字符串。所有相關的問題都表明使用eval(),儘管總是人(和手冊本身)不鼓勵它的使用。

我的問題:我如何獲得$ Math讀取作爲執行操作?

+0

如果我用浮點數代替上面的變量,我會得到預期的輸出:1)從數學:67 2)直接:67'。你有沒有嘗試將你的變量轉換爲正確的數值? – Crackertastic 2014-10-08 17:57:20

+0

@Crackertastic:我不確定如果是正確的數值,並且會檢查我的代碼。爲了簡單起見,我直接寫了$ Math,但它實際上是用'$ ForMath [$ key]。=「\ $ ArrayDBs [\ $ i] ['」。$ key。「_」。$ matches [1] [$ n]。「']」; $ Math = array_values($ ForMath);'並且我的問題的代碼被稱爲$ Math [0]或類似的。無論如何,當迴應「閱讀」是與我想評估的表達相同。我會仔細審查我的代碼(我絕不是專家......)。謝謝。 – CMArg 2014-10-08 18:28:35

+0

通常,PHP對於在算術之前認爲字符串「認爲」是數字併爲您進行投射很好,但PHP並不完美。你總是可以嘗試在變量前面放置'(float)'或'(int)'來告訴PHP來投射一個變量。 PHP的[settype()](http://php.net/manual/en/function.settype.php)函數也很有幫助,因爲它會返回一個布爾值,讓您知道投射是否成功。 – Crackertastic 2014-10-08 18:36:31

回答

0

PHP不能遞歸執行。您不能將PHP代碼嵌入到字符串中,並希望PHP也能執行它。

例如

<?php 

echo "Hello <?php echo 'world' ?>"; 

?> 

是要打印出來,從字面上:

Hello <?php echo 'world' ?> 

如果你想有一個變量的內容被視爲「數學」(如PHP代碼),那麼你就必須執行這些內容,例如

php > $foo = "echo 1+1;"; 
php > eval($foo); 
2 

並注意變量的內容必須是有效的php代碼。 eval('1+1')將計算出2,但由於該值沒有分配到任何位置或返回任何內容,因此將被簡單地丟棄。


評論隨訪:

php > $a = 1; 
php > $b = 2; 
php > $c = 3; 
php > $d = 4; 
php > $foo = '$bar = ($a + $b) * ($c + $d);'; 
php > eval($foo); 
php > echo $bar; 
21 

作品如預期。

+0

你說得對。那就是問題所在。但是我仍然無法「完全」評估$ Math [0],它的內容如下:($ ArrayDBs [$ i] ['GSE45728_01'] + $ ArrayDBs [$ i] ['GSE45728_02'])。當我用'eval(「\ $ Math2 = \」$ Math [0] \「;」);'嘗試時,響應是'(Array ['GSE45728_01'] + Array ['GSE45728_02'])'正在評估'$ ArrayDBs [$ i]',但不是數組的第二個組件('['GSE45728_02']')。任何想法? – CMArg 2014-10-08 19:58:56

+0

雙引號字符串中多維數組的標準php行爲。 (捲曲)語法「:http:// php。net/manual/zh/language.types.string.php – 2014-10-08 20:02:07

+0

幾乎在那裏。我需要更多的學習和理解,並且會自己嘗試,但如果有人能夠幫助我更多,我會很感激。如果變量被定義爲'({$ ArregloDBs [$ i] ['GSE45728_01']} + {$ ArregloDBs [$ i] ['GSE45728_02']})/({$ ArregloDBs [$ i] ['GSE45728_03'] } + {$ ArregloDBs [$ i] ['GSE45728_04']})',我得到'(5.38084 + 2.84934)/(3.28155 + 3.96505)'。 Id est,它正確評估數組值,但不執行數組值之間的操作。我還需要什麼?也許eval()的eval()? – CMArg 2014-10-08 21:10:59