反转逻辑 AND 条件


Inverting Logical AND Condition

我正在处理以下代码:

// $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块,同时只有在第一个条件产生 true 时才评估第二个条件 - 否则当$data有多个维度时,preg_grep()调用将引发以下通知:

注意:数组到字符串的转换

我知道我可以使用错误抑制运算符或其他一些黑客方法,但我感觉我错过了一些微不足道的东西。有人可以帮助我吗?

首先,显而易见的方式:

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
}
if (!((count($data) == count($data, COUNT_RECURSIVE)) && (count(preg_grep('~^@~', $data)) > 0)))

{ 做点什么}

if (! (
   count($data) == count($data, COUNT_RECURSIVE) && 
   count(preg_grep('~^@~', $data)) > 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 something
}

这样,如果((count($data) == count($data, COUNT_RECURSIVE)) && (count(preg_grep('~^@~', $data)) > 0))为假,则块执行。