Я выполняю очень простое утверждение if, которое работает идеально, пока я не добавлю два дополнительных || (или) операторов.
Вот мой код:
if ($planDetails['Company']['name'] != 'company1' || $planDetails['PlanDetail']['name'] != 'pd-name1' || $planDetails['PlanDetail']['name'] != 'pd-name2') { echo "TEST"; }
Я проверил данные массива и таблицы, чтобы убедиться, что они точны в именах и т . Д. И это не пинает. Что я делаю не так? Когда я удаляю дополнительные 2 || options, первый аргумент работает отлично, поэтому я знаю, что моя логика правильная.
Что я назвал здесь неправильно. Кто-то, пожалуйста, поставил меня прямо!
Ваши орды должны быть и. Выражение a != 1 || a != 2
a != 1 || a != 2
всегда истинно, потому что, независимо от значения a, одно или другое из выражений будет истинным, так что конечный результат будет правдой.
Чтобы исправить, измените ||
to &&
.
Я предполагаю, что вы допустили эту ошибку, потому что вы начали с этого выражения и хотели инвертировать ее:
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'))
Используя этот метод, вам не нужно делать какую-либо сложную логическую логику в своей голове, чтобы увидеть, что она работает – это просто отрицание того, что вы уже знаете. Обратите внимание, что это не то же самое, что инвертировать ==
to !=
Индивидуально. См . Законы Моргана для более подробной информации.
Хорошо, что я читаю здесь:
If $variable is not equal to A Or $variable is not equal to B Then echo "TEST"
Поскольку $variable
не может одновременно равняться как A, так и B, она всегда будет печатать «TEST».
Конечно, вышеупомянутое относится к двум последним условиям в вашем if
.
Пожалуйста, обратитесь к законам Де Моргана .
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 должны быть ложными для печати «TEST». Если одно из них истинно, вы не будете печатать «TEST».
Я считаю, что вы хотите:
NOT (P OR Q OR R)
Что будет:
(NOT P) AND (NOT Q) AND (NOT R)
ИЛИ
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"; }