2011-07-25 78 views
2

我知道這是基本的布爾邏輯,但我堅持:基本布爾邏輯 - 如何測試條件僅當其它條件爲真

我通過數據庫結果循環,併爲每一個我需要檢查以下條件:

if($old_value != $new_value) 

如果上述屬實,動作是:

$old_value = $new_value; 

但有一個次要條件。如果該行的類型是「日期」,我還需要檢查$new_value是否爲空,但操作仍然相同。現在,我這樣做是這樣的:

if($old_value != $new_value) { 
    if($type != date) { 
     $old_value = $new_value; 
    } elseif(!empty($new_value)) { 
     $old_value = $new_value; 
    } 

我過於簡化以上,但真的是一個行操作實際上是幾行,我知道我不需要基於次要條件重複。

但是,我對如何正確結合內部條件和外部條件的方式感到茫然。如果我這樣做:

if(($old_value != $new_value) && ($type == 'date' && !empty($new_value)) 

然後,它會返回true的唯一時間是當該行是日期類型。

回答

5

嘗試:

if(($old_value != $new_value) && ($type != 'date' || !empty($new_value)) 

應該這樣做。讓我知道你是否需要幫助瞭解原因。

+0

我不確定我是否理解。具體來說,第二個子句中的OR不會在每次'$ new_value'爲空時返回true,而不是在類型爲'date'時? – Anthony

+0

是的,會的。當old_value與new_value AND不同(我們不是談論日期或者我們正在談論某個日期,但是$ new_value是空的)時,整個表達式是正確的。 – Patrick87

+0

哦,我明白了,'!empty($ new_value)'是否爲真並不重要,因爲'$ type!='date''也是真的,所以條件通過並且動作發生。它還需要我花一些時間才能讓它矇住眼睛,但它開始有意義。謝謝! – Anthony

2

if(($old_value != $new_value) && ($type != 'date' || ($type == 'date' && !empty($new_value))) 也許這一個可以縮短,但我想不出如何。

+1

「$ type =='date'」是多餘的;爲什麼? – Patrick87

+1

現在我明白了,那就是我所說的。因爲or的第二部分只在'$ type =='date''時執行......但是這更好地說明了條件的直接組合。 – Nobody

+0

是的。你的解決方案當然是正確的並且我可以通過De Morgan對子表達的應用來縮短。 – Patrick87