Несколько ИЛИ в php if (), похоже, не отвечает должным образом. Проверенные значения массива и все. Что я делаю неправильно? - PullRequest
4 голосов
/ 04 марта 2011

Я выполняю очень простое выражение if, которое работает идеально, пока я не добавлю два дополнительных || (или) операторы.

Вот мой код:

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

Я проверил данные массива и значения таблиц, чтобы убедиться, что они точно указаны в именах и т. Д. .. И это не так. Что я делаю неправильно? Когда я уберу дополнительные 2 || параметры, первый аргумент работает нормально, поэтому я знаю, что моя логика верна.

Что, во имя, я здесь не так делаю. Кто-нибудь, пожалуйста, поправьте меня!

Ответы [ 3 ]

7 голосов
/ 04 марта 2011

Хорошо, что я читаю здесь:

If $variable is not equal to A Or $variable is not equal to B
Then echo "TEST"

Поскольку $variable не может быть равным и A, и B одновременно, оно будет всегда печатать "ТЕСТ".

Конечно, вышеизложенное относится к двум последним условиям в вашем if.

6 голосов
/ 04 марта 2011

Пожалуйста, обратитесь к законам Де Моргана .

NOT (P AND Q) = (NOT P) OR (NOT Q)
NOT (P OR Q) = (NOT P) AND (NOT Q)

У вас есть:

(NOT P) OR (NOT Q) OR (NOT R)

Что совпадает с:

NOT (P AND Q) OR (NOT R) => 
NOT (P AND Q AND R)

Следовательно, P, Q, R должны быть false , чтобы вывести «TEST». Если один из них true , вы не будете печатать "ТЕСТ".

Я верю, что вы хотите:

NOT (P OR Q OR R)

Что будет:

(NOT P) AND (NOT Q) AND (NOT R)

OR

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

AKA

if ($planDetails['Company']['name'] != 'company1'
&& $planDetails['PlanDetail']['name'] != 'pd-name1' 
&& $planDetails['PlanDetail']['name'] != 'pd-name2')
{ 
    echo "TEST"; 
}
6 голосов
/ 04 марта 2011

Ваши ors должны быть ands.Выражение a != 1 || a != 2 всегда истинно, потому что независимо от значения a одно или другое выражение будет истинным, поэтому конечный результат будет истинным.

Чтобы исправить, измените || на &&.

Полагаю, вы допустили эту ошибку, потому что начали с этого выражения и хотели его инвертировать:

if ($planDetails['Company']['name'] == 'company1'
|| $planDetails['PlanDetail']['name'] == 'pd-name1' 
|| $planDetails['PlanDetail']['name'] == 'pd-name2')

Самый простой способ инвертировать это выражение:

if (!($planDetails['Company']['name'] == 'company1'
|| $planDetails['PlanDetail']['name'] == 'pd-name1' 
|| $planDetails['PlanDetail']['name'] == 'pd-name2'))

Используя этот метод, вам не нужно выполнять какую-либо сложную логическую логику в своей голове, чтобы убедиться, что она работает - это просто простое отрицание того, что вы уже знаете.Обратите внимание, что не - это то же самое, что инвертировать == в != по отдельности.См. Законы Де Моргана для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...