2014-11-05 91 views
1

我使用當我嘗試在if條件使用變量,創建動態像條件語句在if條件下不起作用?

$condition_string = '1==0 AND 1==1'; 

條件的動態腳本,這是行不通的。

if($condition_string) { 

    // do something 

} 

但是,如果我用

if(1==0 AND 1==1) { 

    // do something 

} 

然後它工作。

有人可以告訴如何在條件中使用變量嗎?

+1

什麼是$ rule_condition_string? – Beatles1692 2014-11-05 07:57:46

+1

AND是PHP中的&&。 – 2014-11-05 07:58:08

+0

對不起,它是$ condition_string。 – Ankit 2014-11-05 08:00:05

回答

0

你應該使用eval函數建立與評價的動態腳本,所以:

eval("if($condition_string){ /*do here what you need*/ }else{ /*...*/}"); 

會做這項工作。

+0

@ mark91:感謝它像魅力一樣工作。你救了我的命。 – Ankit 2014-11-05 08:16:32

+0

不客氣。 – mgaido 2014-11-05 11:25:46

1
$condition_string = '1==0 AND 1==1'; 

if($condition_string) { 
    // do something 
} 

if語句中的條件將是converted to boolean其被評估之前。一個字符串將被評估爲TRUE,除非它是一個空字符串或字符串"0"。因此,你上面的條件永遠是真實的。

一種選擇是使用eval評估if以外的條件:

eval ('$condition_string = (1==0 OR 1==1);'); 

if($condition_string) { 
    // do something 
} 

注意ANDprecedence=運營商,所以你必須使用括號周圍的表達。如果您使用&&運營商,則這不是必需的,該運營商的更高,優先於=

另請注意,eval manual page警告:

注意

中的eval()語言結構是非常危險的,因爲它允許任意PHP代碼執行。因此不鼓勵它的使用。如果您已經仔細覈實沒有其他選擇而不是使用此構造,請特別注意不要將任何用戶提供的數據傳遞給它,而不事先進行適當的驗證。

1

我會讓使用eval功能,但是請注意這裏面在PHP manual for eval說:

注意 中的eval()語言結構是非常危險的,因爲它允許任意處決PHP代碼。因此不鼓勵它的使用。如果您已經仔細覈實沒有其他選擇而不是使用此構造,請特別注意不要將任何用戶提供的數據傳遞給它,而不事先進行適當的驗證。

function eval_str($string) { 
    return eval("return $string;"); 
} 

然後,你可以這樣調用

$condition_string = '1==0 AND 1==1'; 
if(eval_str($rule_condition_string)) { // false 
    // code 
} 
0

還有另一種方法,雖然它更復雜一些。但是,它避免使用eval,如下所示:

<?php 
$condition_string = '1==0 || 1==1'; 
$arr = preg_split("/[ ==||]+/",$condition_string); 
$callback = function($s){ 
    return (int) $s; 
}; 
$arrNums = array_map($callback,$arr); 
list($n1, $n2, $n3, $n4) = $arrNums; 
if (($n1 == $n2) || ($n3 == $n4)) { 
    echo "result of logical ||: this works\n"; 
} 
// result of logical ||: this works 

preg_split搜索字符串是否包含空格==或||。如果是這樣的話,字符串被分割成只包含數字的字符串數組。 Arrap_map創建一個新數組,其中包含與$ arr中的每個數字字符串對應的整數。 $ arrNums被分成一個包含變量的列表,其中包含了它的值。 if條件將每對數字進行相等比較。由於代碼使用邏輯||運算符,當第二對數字評估爲真時,條件也與輸出的確認字符串的最終結果一樣評估爲真。