Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проверка множества условий.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
gnork
Отправлено: 01 Августа, 2016 - 11:27:23
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016  


Помог: 0 раз(а)




Как организовать проверку множества условий с реакцией на каждую их комбинацию?
Допустим есть две переменные $a и $b, которые могут принимать значение 1 или 0.
Если a=1 и b=1, $res1=1.
Если a=1 и b=0, $res2=1.
В остальных случаях $res1 и $res2 равны 0.
Для проверки этих условий можно просто использовать if-elseif-else типа такого:

PHP:
скопировать код в буфер обмена
  1. if ($a==1 && $b==1)
  2.     $res1=1;
  3. elseif ($a==1 && $b==0)
  4.     $res2=1;
  5. else
  6.     $res1=0 $res2=0;


Добавляем третью переменную $c тоже 0 или 1 и два результата $res3 и $res4. Список проверяемых условий расширяется, допустим на 2:
Если a=1 и b=1, $res1=1.
Если a=1 и b=0 и с=1, $res2=1.
Если a=1 и с=0, $res3=1.
Если a=1 и b=1 и с=1, $res4=1.
В остальных случаях $res1...4 равны 0.
Тут elseif использовать нельзя, т.к. третье или четвертое "если" , будет пересекаться с первым и не сработает.
Значит проверка разбивается на 4 if-else:

PHP:
скопировать код в буфер обмена
  1. if ($a==1 && $b==1)
  2.     $res1=1;
  3. else
  4.     $res1=0
  5. if ($a==1 && $b==0 && $c==1)
  6.     $res2=1;
  7. else
  8.     $res2=0
  9. if ($a==1 && $c==0)
  10.     $res3=1;
  11. else
  12.     $res3=0
  13. if ($a==1 && $b==1 && $c==1)
  14.     $res4=1;
  15. else
  16.     $res4=0;


Пока не смертельно, но уже стало длинновато. А если перменных штук 20 условий 30-40? Не станет ли время всей этой проверки неприлично большим? Есть ли какие-то другие способы для таких случаев?
 
 Top
miketomlin
Отправлено: 01 Августа, 2016 - 14:45:52
Post Id


Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июль 2016  


Помог: 5 раз(а)




Значение каждого простого условия записывайте в отдельный бит некоторого индекса, а потом по этому индексу выполняйте закрепленное за ним действие. Обычно сначала обнуляют индекс, а потом используют неполную форму ветвления, устанавливая соотв. бит, когда условие истинно. Если у вас условие представляет собой проверку значения нек. переменной на 0/1, то само это значение можно конвертировать в значение бита, вовсе не используя ветвление, – просто делаете арифмет. сдвиг соотв. значения и OR к индексу (если не уверены, что в проверяемой переменной могут быть только 0 и 1, можете себя обезопасить, выполняя AND 1 над значением переменной до сдвига).
 
 Top
Fart
Отправлено: 01 Августа, 2016 - 14:52:26
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




если условий может быть 20-40, с таким же успехом можно создать и 100....1к...1кк... а обрабатывать бесконечное количество условий нет никакого смысла.

здесь либо полученные значения формировать в некий "ключ", "айди" и сравнивать 1 раз его с заранее записанным значением. и код будет пару строк и скорость обработки и занятой памяти машины меньше

(Отредактировано автором: 01 Августа, 2016 - 14:53:42)

 
 Top
gnork
Отправлено: 01 Августа, 2016 - 14:53:53
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016  


Помог: 0 раз(а)




miketomlin пишет:

Идея понятна и для этого случая подходит.
Я думал упростить задачу и загнал ее в несуществующие рамки. Значения переменных могут быть любые и условия их проверки тоже не только "=", но и "больше-меньше". В этом случае ваш способ уже работать не будет...
(Добавление)
Fart пишет:
если условий может быть 20-40, с таким же успехом можно создать и 100....1к...1кк... а обрабатывать бесконечное количество условий нет никакого смысла.

Может быть тогда можно проверять не все "условия", а только те, в которые входит изменившаяся переменная? Ну вот изменилась у нас только переменная "А", а она входит только в условия № 5, 15 и 48. Вот мы эти три условия и проверяем, а остальные не трогаем.

(Отредактировано автором: 01 Августа, 2016 - 14:59:44)

 
 Top
miketomlin
Отправлено: 01 Августа, 2016 - 15:01:14
Post Id


Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июль 2016  


Помог: 5 раз(а)




Да, естественно, если брать в расчет все комбинации из N условий, их будет 2^N, а значит и столько же конечных действий, поэтому кол-во условий нужно контролировать (тут могут быть ограничения по разрядности индекса и т.п.).
 
 Top
Fart
Отправлено: 01 Августа, 2016 - 15:03:13
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




напиши задачу... сколько переменных, какие значения, что нужно выявить, с чес сравнить. не с точки зрения кода, а просто логики.

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

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

поможем, если сам справишься с постановкой задачи.
 
 Top
miketomlin
Отправлено: 01 Августа, 2016 - 15:04:29
Post Id


Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июль 2016  


Помог: 5 раз(а)




gnork пишет:
Я думал упростить задачу и загнал ее в несуществующие рамки. Значения переменных могут быть любые и условия их проверки тоже не только "=", но и "больше-меньше". В этом случае ваш способ уже работать не будет...
Вообще-то пофиг, если говорить о выполнении, либо не выполнении отдельно взятого условия.
(Добавление)
Пример:
PHP:
скопировать код в буфер обмена
  1.  
  2. $index=0;
  3. if ($a>100500) $index|=1;
  4.  
 
 Top
gnork
Отправлено: 01 Августа, 2016 - 15:18:32
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016  


Помог: 0 раз(а)




Fart пишет:
напиши задачу... сколько переменных, какие значения, что нужно выявить, с чес сравнить. не с точки зрения кода, а просто логики.

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

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

поможем, если сам справишься с постановкой задачи.

Попробую тогда описать проблему целиком.
Есть некая база данных. Есть набор правил по которым "если а>5 и b=0, то выполняется записывается значение х=... и выполняется действие 1(например запускается сторонний скрипт), если с<3 и b=32 и d=TRUE, то выполняется действие 2... и так далее". Правил может быть много, как и количество переменных в них проверяемых. И есть периодическое поступление новых значений от сторонних скриптов или из форм каких-нибудь.
При поступлении нового значения (одного или нескольких сразу) нам надо проверить начало ли или закончило выполняться какое-либо правило. Ну т.е. если "а" стало больше 5, то начинаем выполнять действие 1. Где-то тут наверное надо поставить каку-то сортировку, какие условия проверять, а какие нет. Каким образом проводить эту проверку, я пока понять не могу. Вариантов несколько видится:
1. Скрипт, передающий новые значения, запускает вот этот наш проверочный скрипт, передавая ему (например через GET) новые значения. Проверяющий скрипт, вытаскивает из базы все остальные переменные, которые ему нужны для проверки условий и выносит решение о выполнении или невыполнении ответных действий. Если проверять все условия, у нас получается постоянное вытаскивание из базы всех переменных.
2. Проверяющий скрипт крутится в фоне и постоянно проверяет промежуточный файл на предмет появления там новых данных, которые пишутся туда сторонними скриптами. В случае, если новые данные есть, опять происходит проверка ну так далее. Из плюсов этого варианта вижу однократное получение всех переменных из БД и отсутствие необходимости при каждом новом поступлении тащить все из базы (или это не так и плохо?).
3. Можеи более разумный вариант предложите?
Дальше.
Как хранить эти правила? Жестко забить в проверяющий скрипт? А если надо добавить или удалить или изменить правило? Наверное логично список правил хранить тоже в БД. Если бы проверялась только одна переменная, то и правила можно было бы брать по имени этой переменной, а если проверяемых переменных в одном условии 3...5...10? По какому признаку брать необходимые правила?

Вот так вот сумбурно всё пока...

(Отредактировано автором: 01 Августа, 2016 - 15:20:29)

 
 Top
gnork
Отправлено: 01 Августа, 2016 - 15:39:53
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016  


Помог: 0 раз(а)




Fart ЛС написать не могу, мал ещё, а в сетях меня нет, так что лучше здесь.
 
 Top
Fart
Отправлено: 01 Августа, 2016 - 15:45:20
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




1. нужно понять для чего переменные a, b, c, d и какова вероятность, что не будет перечислен весь англоязычный алфавит, да и к тому же не появятся варианты aa, ab... z,z???

2. с таким количество переменных напрашивается вывод, что необходимо менять логику скрипта и сокращать диапазон значений, ограничиваясь только 2-3 переменными

(Добавление)
3. если поступают новые значения, они должны быть "однотипны" предыдущим или являться массивом, но суть должна оставаться прежняя. например: 1) a1, a2, a3 - 2) a1, a2, a3, a4. 3) a1, a2, a3... aN - этот вариант не имеет смысла

(Добавление)
4. эти создаваемые переменные имеют общую парадигму, а не являются следствием просто другого кода

(Добавление)
5. если же скрипт собирает данные последовательно, то нужно понять в какой момент идет сбор и его нужно обрабатывать на той стадии, в которой он по сути сообщает машине, что имеет место быть

(Отредактировано автором: 01 Августа, 2016 - 16:04:46)

 
 Top
gnork
Отправлено: 01 Августа, 2016 - 16:04:00
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016  


Помог: 0 раз(а)




Fart
Вот есть курсы валют. Их может быть 5, а может быть 25. И меняются одни курсы каждый день, а какие-то раз в неделю. И есть цена на какой-нибудь рис, которая скачет как ей угодно. И есть погода, которая влияет на урожай, а значит на цену этого риса в юанях, а значит и на цену в рублях, но уже через курс. Значит мы имеем три таблицы в БД, которые обновляются не синхронно и от значения которых всех вместе зависит четвертая переменная. Предположим это количество вагонов для перевозки этого риса. Потом добавляем еще таблицу с пшеном, которому пофиг погода, но важен курс какого-нибудь динара. Получается второе условие, где количество кульков для пшена зависит от курса и цены пшена. Ну и так далее.

Ответ написал до изменения предыдущего сообщения. Сейчас попробую по пунктам ответить.
1. Количество переменных может меняться со временем, так же, как и количество праил.
2. Не очень понял про логику и диапазон.
3. Данные однотипны. Это числа. Но они пишутся в разные таблицы и приходят не одновременно.
4. Не совсем понял. Переменные поступают от сторонних скриптов, пользователя или иных источников.
5. Обработка данных нужна при изменении любой переменной.

(Отредактировано автором: 01 Августа, 2016 - 16:10:34)

 
 Top
Fart
Отправлено: 01 Августа, 2016 - 16:12:00
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




ок. у нас таблица с которой начинаем:

наименование|стоимость|вид валюты|время последнего изменения|влияние 1|влияние 2| влияние 3

так понимаю?
 
 Top
gnork
Отправлено: 01 Августа, 2016 - 16:14:41
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016  


Помог: 0 раз(а)




Что понимать под "влияниями"?
 
 Top
Fart
Отправлено: 01 Августа, 2016 - 16:15:28
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




ты говоришь, что меняется от чего то... значит влияет на цену... эта величина важна и ее нужно с чем то сравнивать или это просто значение?
 
 Top
gnork
Отправлено: 01 Августа, 2016 - 16:21:25
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016  


Помог: 0 раз(а)




Т.е. это некие пороговые значения с которыми мы будем сравнивать текущее значение? Возможно.
Если честно, я видел это несколько иначе.
Несколько таблиц со значениями. Для каждой переменной своя таблица. И одна таблица с правилами в которой каждому условию (или группе условий) соответствует ответная реакция. Так вот нам нужно из этой таблицы отобрать правила, в которых участвует та переменная, которая изменилась и эти правила выполнить. Если этот отбор не проводить, то проверяться будут все правила, а их может быть много.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB