php中的多个OR如果()似乎没有正确响应.经测试的数组值和所有.我究竟做错了什么?

Old*_*est 4 php mysql arrays if-statement

我正在运行一个非常简单的if语句,它完美无缺,直到我添加了两个额外的|| (或)运营商.

这是我的代码:

if ($planDetails['Company']['name'] != 'company1'
|| $planDetails['PlanDetail']['name'] != 'pd-name1' 
|| $planDetails['PlanDetail']['name'] != 'pd-name2') { echo "TEST"; }
Run Code Online (Sandbox Code Playgroud)

我检查了我的数组数据和表值,以确保它们在名称等方面是精确的.这不是踢.我究竟做错了什么?当我删除额外的2 || 选项,第一个参数工作正常,所以我知道我的逻辑是正确的.

这个名字是什么,我在这里做错了.有人请我直截了当!

Jon*_*Jon 7

那么,我在这里读到的是:

If $variable is not equal to A Or $variable is not equal to B
Then echo "TEST"
Run Code Online (Sandbox Code Playgroud)

由于$variable不能同时等于A和B,它将始终打印"TEST".

当然,以上是指你的最后两个条件if.

  • +1:如果您应用[DeMorgan的法律](http://en.wikipedia.org/wiki/De_Morgan%27s_laws)并将该陈述视为:`如果不是($ variable = A AND $ variable = B),则会更清楚)`.然后很明显,$ variable不能同时是A和B. (3认同)

Mar*_*ers 6

你的ors应该是ands.表达式a != 1 || a != 2总是正确的,因为无论a的值是什么,表达式中的一个或另一个都是真的,因此最终结果将为真.

要修复,请更改||&&.

我猜你犯了这个错误,因为你开始使用这个表达式并想要反转它:

if ($planDetails['Company']['name'] == 'company1'
|| $planDetails['PlanDetail']['name'] == 'pd-name1' 
|| $planDetails['PlanDetail']['name'] == 'pd-name2')
Run Code Online (Sandbox Code Playgroud)

反转此表达式的最简单方法如下:

if (!($planDetails['Company']['name'] == 'company1'
|| $planDetails['PlanDetail']['name'] == 'pd-name1' 
|| $planDetails['PlanDetail']['name'] == 'pd-name2'))
Run Code Online (Sandbox Code Playgroud)

使用这种方法,你不需要在头脑中做任何复杂的布尔逻辑来看它是否有效 - 它只是对你已经知道的东西的简单否定.请注意,这是一样的翻转==,以!=个别.有关详细信息,请参阅De Morgan定律.

  • +1表示布尔逻辑课程和De Morgan参考. (2认同)

SQL*_*son 6

请参阅De Morgan的法律.

NOT (P AND Q) = (NOT P) OR (NOT Q)
NOT (P OR Q) = (NOT P) AND (NOT Q)
Run Code Online (Sandbox Code Playgroud)

你有:

(NOT P) OR (NOT Q) OR (NOT R)
Run Code Online (Sandbox Code Playgroud)

这与以下相同:

NOT (P AND Q) OR (NOT R) => 
NOT (P AND Q AND R)
Run Code Online (Sandbox Code Playgroud)

因此,P,Q,R必须都是假的才能打印"TEST".如果其中一个是真的那么你就不会打印"TEST".

我相信你想:

NOT (P OR Q OR R)
Run Code Online (Sandbox Code Playgroud)

这将是:

(NOT P) AND (NOT Q) AND (NOT R)
Run Code Online (Sandbox Code Playgroud)

要么

if (!($planDetails['Company']['name'] == 'company1'
|| $planDetails['PlanDetail']['name'] == 'pd-name1' 
|| $planDetails['PlanDetail']['name'] == 'pd-name2'))
{ 
    echo "TEST"; 
}
Run Code Online (Sandbox Code Playgroud)

AKA

if ($planDetails['Company']['name'] != 'company1'
&& $planDetails['PlanDetail']['name'] != 'pd-name1' 
&& $planDetails['PlanDetail']['name'] != 'pd-name2')
{ 
    echo "TEST"; 
}
Run Code Online (Sandbox Code Playgroud)

  • 哇,这花了我太长时间打字...似乎其他人也发布了类似的答案 (3认同)