2014-12-11 3 views
0

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

Существует четыре рабочих места, названных: B.Avf, R.Avf, Office and 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

not strpos [its strpos ( – fortune

+0

@LalitSharma Интересно! – StoneStreet

ответ

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» отсутствует? – StoneStreet

+0

Выше инструкции 'if' проверяют, есть ли' R.Avf' в вашем сеансе, а также найдите в своей '$ history' или' B.Avf' в вашем сеансе, а также найдите в своей '$ history', чем' true', иначе его 'false'. –

+0

Да, ваши условия работы.Но это на самом деле не решает мою проблему.Маби мой комментарий к коду не объясняет мою реальную проблему? Продукт не должен передавать« B.Avf », если он прошел» R.Avf "ИЛИ" B.Avf "и наоборот .. – StoneStreet

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 и затем проверяет все условия внутри скобки s

+0

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

0

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

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

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

isHistoryAvf($history, "R.Avf") 

и вы в конечном итоге только с:

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

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

P.S. Рассмотрим другой метод именования

1

Ваш если заявление может быть сделано намного проще, удалив одно условие и по-прежнему получать желаемый результат примерно так:

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

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

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

+0

Спасибо! Код стал лучше! Но мой комментарий к коду заставил всех вас смутить. В моем «Большом» вопросе я также попросил: IF продукт прошел «R.Avf», он не может получить пропуск «B.Avf». Но «офис» и «производство». Это был мой «БОЛЬШОЙ» вопрос. – StoneStreet

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)