2012-07-26 52 views
0

我試圖重寫一個條件來刪除{ .. }語句(以使代碼縮進)。逆向條件

目前我有:

while($something){ 
    if((strcasecmp($str1, $str2) === 0) 
    || (isset($arr[0]) && strcasecmp($str3, $str4) === 0)){ 

    // a lot of code here... 
    break; 
    } 
} 

隨着相逆的IF條件就應該是這樣的:

while($something){ 
    if((strcasecmp($str1, $str2) !== 0) 
    && (empty($arr[0]) && strcasecmp($str3, $str4) !== 0)) 
     continue; 
    // a lot of code here... 
    break; 
} 

但它不工作。我的代碼和break語句在不應該的時候被執行。

我在這裏做錯了什麼。

+1

我誠實地不會重構你的代碼來擺脫'{..}'。重構它是否會導致問題,如果它增加可讀性等,但在這種情況下並不適用。 – 2012-07-26 13:14:51

+0

一個簡單的方法來獲得反轉條件是做'!(oldconditions)' – Esailija 2012-07-26 13:14:55

+1

'break'有什麼好處?據我所見,while($ x){/*..*/ break; }'和'if($ x){/*..*/}'是一樣的:? – KingCrunch 2012-07-26 13:15:00

回答

1

這裏

(empty($arr[0]) && strcasecmp($str3, $str4) !== 0)) 

&&必須||

我自己會保留第一個變體,因爲它稍微直截了當。

更新:好的,正如我想的那樣,break;讓我感到驚訝。你想擺脫一個intendation?

if ($something 
    && ((strcasecmp($str1, $str2) === 0) || (isset($arr[0]) && strcasecmp($str3, $str4)) === 0) 
){ 

    // a lot of code here... 
} 

而且知道有些微的優化:)(!strcasecmp()手段,他們相等,除了可能的情況下)

if ($something && (!strcasecmp($str1, $str2) || (isset($arr[0]) && !strcasecmp($str3, $str4))) { 

    // a lot of code here... 
} 

我希望paranthesis匹配。

+0

[:-P](http://stackoverflow.com/questions/11670053/inverse-conditions#comment15467915_11670053) – Neal 2012-07-26 13:20:20

+0

要小心。 'empty'與'!isset'不一樣。確實'空(0)'是真的,但'!isset(0)'是假的 – Alfwed 2012-07-26 13:22:25

+0

@Alfwed你是對的,但我採取了不重構的變體,因此這個應該像預期的那樣工作。 – KingCrunch 2012-07-26 13:28:09

1

這應該工作

while($something){ 
    if((strcasecmp($str1, $str2) !== 0) 
    && (!isset($arr[0]) || strcasecmp($str3, $str4) !== 0)) 
     continue; 
    // a lot of code here... 
    break; 
}