Сложный `if` case, правильно?

0

Я очень стараюсь понять, как решить эту проблему. Пожалуйста, будьте осторожны, я все еще учусь!

Существует четыре рабочих места: B.Avf, R.Avf, Office и Production. Продукты проходят через рабочие места. Теперь я создаю скрипт, который может оповещать, если один и тот же продукт проходит одно и то же рабочее место дважды. Теперь это сложная часть: если продукт прошел "B.Avf", он не может передать "R.Avf" без предупреждения, то же самое, если продукт прошел "R.Avf", он не может пройти "B.Avf "whitout и alert. Но если продукт прошел для ex. "R.Avf" нормально пропускать "Office" без предупреждения.

Это то, что я получил до сих пор: (Это как пример № 5 =)

Maby должен ли я создавать вложенные операторы if?

Этот код будет верным все время!

PHP

if($_SESSION['user']['usr_workplace'] == "R.Avf" ||
   $_SESSION['user']['usr_workplace'] == "B.Avf" && 
   strpos($history, "R.Avf") !== FALSE ||
   strpos($history, "B.Avf") !== FALSE)
  • 0
    Вы должны использовать скобки при применении нескольких условий
  • 0
    не strpos [его strpos (
Показать ещё 2 комментария
Теги:

5 ответов

2
Лучший ответ

Условие if должно быть:

//IF this session user workplace is "B.Avf" or "R.Avf"
//AND "B.Avf" or "R.Avf" excist in history, then alert!

if(($_SESSION['user']['usr_workplace'] == "R.Avf"  || $_SESSION['user']['usr_workplace'] == "B.Avf") && (strpos($history, "R.Avf") !== FALSE || strpos($history, "B.Avf") !== FALSE))
  • 0
    Это действительно правильно? Условие, в котором «R.Avf» - это история, но продукт проходит «B.Avf» отсутствует?
  • 0
    Выше if заявление проверьте R.Avf в сеансе , а также найти в ваших $history или если B.Avf в вашей сессии , а также найти в ваших $history , чем true в противном случае его false .
Показать ещё 4 комментария
1

Оператор if можно сделать намного проще, удалив одно условие и получив желаемый результат:

if(
    ($_SESSION['user']['usr_workplace'] == "R.Avf" || $_SESSION['user']['usr_workplace'] == "B.Avf")
    && 
    strpos($history, $_SESSION['user']['usr_workplace']) !== false
)

Обратите внимание на то, что вам не нужны две проверки strpos, так как первая часть оператора if будет разрешать запуск второй части, если это правда.

Было бы лучше извлечь это в метод или упростить его дальше, но за то, что вы просили, это будет делать :).

  • 0
    Спасибо! Код получил лучшую производительность! Но мой комментарий к коду привел вас в замешательство. В моем "Большом" вопросе, который я также спросил: ЕСЛИ продукт прошел "R.Avf", он не может пройти "B.Avf". Но "офис" и "Производство". Это был мой "БОЛЬШОЙ" вопрос.
0

вам нужно просто проверить session value на $history чтобы избежать проверки two strpos() где вы выполняете статическую проверку строки:

здесь вы проверяете статическую строку:

strpos($history, "R.Avf") !== FALSE ||
   strpos($history, "B.Avf") !== FALSE)

сделайте его динамичным следующим образом:

if($_SESSION['user']['usr_workplace'] == "R.Avf" || $_SESSION['user']['usr_workplace'] == "B.Avf" && strpos($history, $_SESSION['user']['usr_workplace']) !== FALSE )
0

вы должны разбить это, если в 2 метода. нужно называть:

isUserSessionRBAvf($_SESSION['user']['usr_workplace'])

другой должен проверить strpos pos:

isHistoryAvf($history, "R.Avf")

и вы получите в итоге:

if(isUserSessionRBAvf(...) && isHistoryAvf(...))

таким образом у вас есть более читаемый код и легче отлаживать.

PS рассматривает другой метод именования

0

Это работает, оно имеет правильные фигурные скобки:

if($_SESSION['user']['usr_workplace'] == "R.Avf" || ($_SESSION['user']['usr_workplace'] == "B.Avf" && (strpos($history, "R.Avf") !== FALSE || strpos($history, "B.Avf") !== FALSE)))

Он сначала проверяет r.Avf, OR и затем проверяет все условия в фигурных скобках

  • 0
    Не совсем работает. Эта строка кода возвращает TRUE, даже если $ history не содержит «R.Avf» или «B.Avf»

Ещё вопросы

Сообщество Overcoder
Наверх
Меню