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 :: Проверка множества условий.
Покинул форум
Сообщений всего: 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 типа такого:
Добавляем третью переменную $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:
Пока не смертельно, но уже стало длинновато. А если перменных штук 20 условий 30-40? Не станет ли время всей этой проверки неприлично большим? Есть ли какие-то другие способы для таких случаев?
miketomlin
Отправлено: 01 Августа, 2016 - 14:45:52
Частый гость
Покинул форум
Сообщений всего: 129
Дата рег-ции: Июль 2016
Помог: 5 раз(а)
Значение каждого простого условия записывайте в отдельный бит некоторого индекса, а потом по этому индексу выполняйте закрепленное за ним действие. Обычно сначала обнуляют индекс, а потом используют неполную форму ветвления, устанавливая соотв. бит, когда условие истинно. Если у вас условие представляет собой проверку значения нек. переменной на 0/1, то само это значение можно конвертировать в значение бита, вовсе не используя ветвление, – просто делаете арифмет. сдвиг соотв. значения и OR к индексу (если не уверены, что в проверяемой переменной могут быть только 0 и 1, можете себя обезопасить, выполняя AND 1 над значением переменной до сдвига).
Fart
Отправлено: 01 Августа, 2016 - 14:52:26
Посетитель
Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016
Помог: 10 раз(а)
если условий может быть 20-40, с таким же успехом можно создать и 100....1к...1кк... а обрабатывать бесконечное количество условий нет никакого смысла.
здесь либо полученные значения формировать в некий "ключ", "айди" и сравнивать 1 раз его с заранее записанным значением. и код будет пару строк и скорость обработки и занятой памяти машины меньше
Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016
Помог: 0 раз(а)
miketomlin пишет:
Идея понятна и для этого случая подходит.
Я думал упростить задачу и загнал ее в несуществующие рамки. Значения переменных могут быть любые и условия их проверки тоже не только "=", но и "больше-меньше". В этом случае ваш способ уже работать не будет... (Добавление)
Fart пишет:
если условий может быть 20-40, с таким же успехом можно создать и 100....1к...1кк... а обрабатывать бесконечное количество условий нет никакого смысла.
Может быть тогда можно проверять не все "условия", а только те, в которые входит изменившаяся переменная? Ну вот изменилась у нас только переменная "А", а она входит только в условия № 5, 15 и 48. Вот мы эти три условия и проверяем, а остальные не трогаем.
Покинул форум
Сообщений всего: 129
Дата рег-ции: Июль 2016
Помог: 5 раз(а)
Да, естественно, если брать в расчет все комбинации из N условий, их будет 2^N, а значит и столько же конечных действий, поэтому кол-во условий нужно контролировать (тут могут быть ограничения по разрядности индекса и т.п.).
Fart
Отправлено: 01 Августа, 2016 - 15:03:13
Посетитель
Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016
Помог: 10 раз(а)
напиши задачу... сколько переменных, какие значения, что нужно выявить, с чес сравнить. не с точки зрения кода, а просто логики.
что ты хочешь увидеть, какой должен быть результат, а код можно подогнать под твои условия.
также должен учитывать, что бесконечное количество раз стоит избегать. если данных очень много, то тут работа с составлением БД.
поможем, если сам справишься с постановкой задачи.
miketomlin
Отправлено: 01 Августа, 2016 - 15:04:29
Частый гость
Покинул форум
Сообщений всего: 129
Дата рег-ции: Июль 2016
Помог: 5 раз(а)
gnork пишет:
Я думал упростить задачу и загнал ее в несуществующие рамки. Значения переменных могут быть любые и условия их проверки тоже не только "=", но и "больше-меньше". В этом случае ваш способ уже работать не будет...
Вообще-то пофиг, если говорить о выполнении, либо не выполнении отдельно взятого условия. (Добавление)
Пример:
Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016
Помог: 0 раз(а)
Fart пишет:
напиши задачу... сколько переменных, какие значения, что нужно выявить, с чес сравнить. не с точки зрения кода, а просто логики.
что ты хочешь увидеть, какой должен быть результат, а код можно подогнать под твои условия.
также должен учитывать, что бесконечное количество раз стоит избегать. если данных очень много, то тут работа с составлением БД.
поможем, если сам справишься с постановкой задачи.
Попробую тогда описать проблему целиком.
Есть некая база данных. Есть набор правил по которым "если а>5 и b=0, то выполняется записывается значение х=... и выполняется действие 1(например запускается сторонний скрипт), если с<3 и b=32 и d=TRUE, то выполняется действие 2... и так далее". Правил может быть много, как и количество переменных в них проверяемых. И есть периодическое поступление новых значений от сторонних скриптов или из форм каких-нибудь.
При поступлении нового значения (одного или нескольких сразу) нам надо проверить начало ли или закончило выполняться какое-либо правило. Ну т.е. если "а" стало больше 5, то начинаем выполнять действие 1. Где-то тут наверное надо поставить каку-то сортировку, какие условия проверять, а какие нет. Каким образом проводить эту проверку, я пока понять не могу. Вариантов несколько видится:
1. Скрипт, передающий новые значения, запускает вот этот наш проверочный скрипт, передавая ему (например через GET) новые значения. Проверяющий скрипт, вытаскивает из базы все остальные переменные, которые ему нужны для проверки условий и выносит решение о выполнении или невыполнении ответных действий. Если проверять все условия, у нас получается постоянное вытаскивание из базы всех переменных.
2. Проверяющий скрипт крутится в фоне и постоянно проверяет промежуточный файл на предмет появления там новых данных, которые пишутся туда сторонними скриптами. В случае, если новые данные есть, опять происходит проверка ну так далее. Из плюсов этого варианта вижу однократное получение всех переменных из БД и отсутствие необходимости при каждом новом поступлении тащить все из базы (или это не так и плохо?).
3. Можеи более разумный вариант предложите?
Дальше.
Как хранить эти правила? Жестко забить в проверяющий скрипт? А если надо добавить или удалить или изменить правило? Наверное логично список правил хранить тоже в БД. Если бы проверялась только одна переменная, то и правила можно было бы брать по имени этой переменной, а если проверяемых переменных в одном условии 3...5...10? По какому признаку брать необходимые правила?
Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016
Помог: 0 раз(а)
Fart ЛС написать не могу, мал ещё, а в сетях меня нет, так что лучше здесь.
Fart
Отправлено: 01 Августа, 2016 - 15:45:20
Посетитель
Покинул форум
Сообщений всего: 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. если же скрипт собирает данные последовательно, то нужно понять в какой момент идет сбор и его нужно обрабатывать на той стадии, в которой он по сути сообщает машине, что имеет место быть
Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016
Помог: 0 раз(а)
Fart
Вот есть курсы валют. Их может быть 5, а может быть 25. И меняются одни курсы каждый день, а какие-то раз в неделю. И есть цена на какой-нибудь рис, которая скачет как ей угодно. И есть погода, которая влияет на урожай, а значит на цену этого риса в юанях, а значит и на цену в рублях, но уже через курс. Значит мы имеем три таблицы в БД, которые обновляются не синхронно и от значения которых всех вместе зависит четвертая переменная. Предположим это количество вагонов для перевозки этого риса. Потом добавляем еще таблицу с пшеном, которому пофиг погода, но важен курс какого-нибудь динара. Получается второе условие, где количество кульков для пшена зависит от курса и цены пшена. Ну и так далее.
Ответ написал до изменения предыдущего сообщения. Сейчас попробую по пунктам ответить.
1. Количество переменных может меняться со временем, так же, как и количество праил.
2. Не очень понял про логику и диапазон.
3. Данные однотипны. Это числа. Но они пишутся в разные таблицы и приходят не одновременно.
4. Не совсем понял. Переменные поступают от сторонних скриптов, пользователя или иных источников.
5. Обработка данных нужна при изменении любой переменной.
Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016
Помог: 10 раз(а)
ок. у нас таблица с которой начинаем:
наименование|стоимость|вид валюты|время последнего изменения|влияние 1|влияние 2| влияние 3
так понимаю?
gnork
Отправлено: 01 Августа, 2016 - 16:14:41
Новичок
Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016
Помог: 0 раз(а)
Что понимать под "влияниями"?
Fart
Отправлено: 01 Августа, 2016 - 16:15:28
Посетитель
Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016
Помог: 10 раз(а)
ты говоришь, что меняется от чего то... значит влияет на цену... эта величина важна и ее нужно с чем то сравнивать или это просто значение?
gnork
Отправлено: 01 Августа, 2016 - 16:21:25
Новичок
Покинул форум
Сообщений всего: 11
Дата рег-ции: Авг. 2016
Помог: 0 раз(а)
Т.е. это некие пороговые значения с которыми мы будем сравнивать текущее значение? Возможно.
Если честно, я видел это несколько иначе.
Несколько таблиц со значениями. Для каждой переменной своя таблица. И одна таблица с правилами в которой каждому условию (или группе условий) соответствует ответная реакция. Так вот нам нужно из этой таблицы отобрать правила, в которых участвует та переменная, которая изменилась и эти правила выполнить. Если этот отбор не проводить, то проверяться будут все правила, а их может быть много.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.