0

我正在下面的代碼:反轉邏輯與條件

// $data has only one dimension AND at least one of its values start with a "@" 
if ((count($data) == count($data, COUNT_RECURSIVE)) 
    && (count(preg_grep('~^@~', $data)) > 0)) 
{ 
    // do nothing 
} 

else 
{ 
    // do something 
} 

這種情況下的邏輯是工作得很好,不過,我寧願如果我能擺脫空if塊,而評估只有當第一個真正產生第二個條件 - 否則preg_grep()調用將拋出下面的通知時$data有多個維度:

注意:數組字符串轉換

我知道我可以使用錯誤抑制操作或其他一些哈克方法,但是我有我失去了一些東西瑣碎的感覺。有人可以幫我解決嗎?

+0

'&&'已經短路......不是嗎? – Ryan 2011-05-09 01:32:35

回答

3

首先,顯而易見的方法:

if (!((count($data) == count($data, COUNT_RECURSIVE)) 
    && (count(preg_grep('~^@~', $data)) > 0))) 
{ 
    // everything is cool, nothing to do 
} 

else 
{ 
    // do something 
} 

其次,正確方式

if ((count($data) < count($data, COUNT_RECURSIVE)) 
|| (count(preg_grep('~^@~', $data)) == 0)) 
{ 
    // everything is cool, nothing to do 
} 

else 
{ 
    // do something 
} 
+0

顯然,謝謝! :) – 2011-05-09 01:35:37

2
if (!((count($data) == count($data, COUNT_RECURSIVE)) && (count(preg_grep('~^@~', $data)) > 0))) 

{// 做一些 }

2
if (! (
    count($data) == count($data, COUNT_RECURSIVE) && 
    count(preg_grep('~^@~', $data)) > 0 
    ) 

裹條件的整組,堅持!在開始時。換行是爲了可讀性。我也刪除了不必要的()以及個別條件。

+0

謝謝,我很少使用這個操作符,有時甚至會忘記它存在。 – 2011-05-09 01:36:42

1

我並不完全清楚你問什麼,但我想你想:

// $data has only one dimension AND at least one of its values start with a "@" 
if (!((count($data) == count($data, COUNT_RECURSIVE)) 
    && (count(preg_grep('~^@~', $data)) > 0))) 
{ 
    // do something 
} 

這樣,如果((count($data) == count($data, COUNT_RECURSIVE)) && (count(preg_grep('~^@~', $data)) > 0))爲假,則該塊執行。