PHP if утверждение strpos === false с или || - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь получить выражение if для echo, равное true, но равное false. Что я делаю не так?

иногда $ line-2 будет 5%, а иногда 0%. Так что меняется так. Как бы я написал оператор if для обоих случаев?

Так что, в принципе, я хочу, чтобы он отображал значение true, если переменная line_2 равна 0% или 5%. Я хочу, чтобы он отображал значение false, если переменная отлична от 0% или 5%.

$line_2 = '5%'; // this will be random. Can be 0%. Can be 5%. Can be 25%.

if (strpos($line_2, '5') === false || strpos($line_2, '0') === false) {
    echo 'equals false';
} else {
    echo 'equals true';
}

больше уточнений.

Там, где написано echo 'equals false', на самом деле есть команда для выполнения другого сценария php. Мне нужно, чтобы этот скрипт выполнялся, только если line_2 не равно 5% или не равно 0%.

Надеюсь, что подытожим.

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Ваша проблема связана с неправильным пониманием того, как вы отрицаете условные высказывания.

Вы упоминаете, что хотите повторить true, если $line_2 содержит 0 ИЛИ 5; однако ваш оператор if проверяет условие, противоположное эхо false, и выдает эхо true в случае сбоя условия. Поэтому нам нужно изменить условие с if line contains 0 or line contains 5 на if not (line contains 0 or line contains 5).

Способ, которым вы достигнете этого, заключается в рассмотрении законов де Моргана . В частности, когда вы распределяете отрицание по логическому ИЛИ или логическому И, выполняется следующее:

  • not (A OR B) = (not A) AND (not B)
  • not (A AND B) = (not A) OR (not B)

То есть вы распределяете отрицание и меняете логический оператор на его противоположность.

В этом случае, поскольку вы хотите выполнить not (line contains 0 or line contains 5), вы должны распределить его так, чтобы вы получили (not line contains 0) and (not line contains 5), который выглядит следующим образом:

$line_2 = '5%'; // this will be random. Can be 0%. Can be 5%. Can be 25%.

if (strpos($line_2, '5') === false && strpos($line_2, '0') === false) {
    echo 'equals false';
} else {
    echo 'equals true';
}

Проблема с вашим текущим кодом заключается в том, что вместо этого у вас есть решение, напоминающее if (not line contains 0) or (not line contains 5). Разница между ними заключается только в логическом операторе, соединяющем два условия, где вы используете or, но на самом деле вы должны использовать and.

0 голосов
/ 10 сентября 2018

Используйте && вместо

Использование оператора OR в этом операторе if вернет true, если этот символ '5' ИЛИ ​​'0'

Итак, поскольку strpos($line_2, '0') === false вернет true, ваше утверждение станет

if(false || true)

, таким образом, повторяя 'равно false', тогда как используя AND

if(false && true)

будет ложным, давая вам «равный правде»

0 голосов
/ 10 сентября 2018

Для этого вам не нужно strpos(), если только $line_2 не может содержать больше строк.

<?php

$line_2 = '5%';

$statement = 'equals false';    //Set the default message
if ($line_2 === '5%' || $line_2 === '%0') {  //Check if $line_2 equals 5% or 2%. Note the strong comparison since $line_2 is a string.
    $statement = 'equals true';
}

echo $statement;
0 голосов
/ 10 сентября 2018

На основании редактирования OP вы должны изменить свою логику проверки условия. Сделайте следующее:

$line_2 = '5%'; // Or it can be 0%

if (strpos($line_2, '5') !== false || strpos($line_2, '0') !== false) {
    echo 'equals true'; // 0 or 5 is found in the string
} else {
    echo 'equals false';
}
...