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))为假,则该块执行。