Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 01.08.2016
Сообщений: 3

Проверка множества условий

01.08.2016, 13:18. Показов 4168. Ответов 9
Метки нет (Все метки)

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

PHP
1
2
3
4
5
6
if ($a==1 && $b==1) 
    $res1=1;
elseif ($a==1 && $b==0) 
    $res2=1;
else 
    $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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ($a==1 && $b==1) 
    $res1=1;
else 
    $res1=0
if ($a==1 && $b==0 && $c==1) 
    $res2=1;
else 
    $res2=0
if ($a==1 && $c==0) 
    $res3=1;
else 
    $res3=0
if ($a==1 && $b==1 && $c==1) 
    $res4=1;
else 
    $res4=0;
Пока не смертельно, но уже стало длинновато. А если перменных штук 20 условий 30-40? Не станет ли время всей этой проверки неприлично большим? Есть ли какие-то другие способы для таких случаев?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.08.2016, 13:18
Ответы с готовыми решениями:

Проверка условий
Задача тривиальна. Скрипт принимает данные и что-то с ними делает, если они не пустые. А вот одна или несколько переменных пусты, то...

Проверка нескольких условий
Нужно проверить сразу несколько условий if($a == $b && $c == $d){ echo "true"; } Нужно в зависимости от того первое условие...

Почему не проходит проверка условий?
Нужно, чтобы если выбирались значения в обоих SELECT'ах city1 и city2 либо в time1 и time2, то выводилось "Заполнить либо время...

9
39 / 35 / 23
Регистрация: 10.11.2013
Сообщений: 89
01.08.2016, 13:58
можно так извратиться =)
PHP
1
2
3
4
5
$str = "$a$b$c";
switch ($str) {
    case "001": break;
 
}
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
01.08.2016, 14:01
Для начала, ваш код можно упростить до
PHP
1
2
3
4
5
<?php
$res1 = (int)($a==1 && $b==1) ;
$res2 = (int)($a==1 && $b==0 && $c==1);
$res3 = (int)($a==1 && $c==0);
$res4 = (int)($a==1 && $b==1 && $c==1);
Обобщенный вариант
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
$rules = [
    'res1' => [
        'a' => 1,
        'b' => 1
    ],
    'res2' => [
        'a' => 1,
        'b' => 0,
        'c' => 1
    ],
    'res3' => [
        'a' => 1,
        'c' => 0
    ],
    'res4' => [
        'a' => 1,
        'b' => 1,
        'c' => 1
    ],
];
 
$vars = [
    'a' => 1,
    'b' => 0,
    'c' => 1
];
 
$result = solve($rules, $vars);
print_r($result);
//---------------------------------
function solve($rules_list, $variables)
{
    $result = [];
    foreach ($rules_list as $name => $current_rules) {
        $tmp = true;
        foreach ($current_rules as $variable => $value) {
            if(!($tmp = $tmp && ($variables[$variable] == $value))) {
                break;
            }
        }
        $result[$name] = (int)$tmp;
    }
    return $result;
}
0
0 / 0 / 0
Регистрация: 01.08.2016
Сообщений: 3
01.08.2016, 14:07  [ТС]
можно так извратиться =)
Да... Неудачный у меня пример получился. В жизни будут не только 0 и 1. И не обязательно равенства, может быть и "больше-меньше".

Добавлено через 4 минуты
Цитата Сообщение от Cra3y Посмотреть сообщение
Для начала, ваш код можно упростить до
PHP
1
2
3
4
5
<?php
$res1 = (int)($a==1 && $b==1) ;
$res2 = (int)($a==1 && $b==0 && $c==1);
$res3 = (int)($a==1 && $c==0);
$res4 = (int)($a==1 && $b==1 && $c==1);
Если я правильно понимаю, в правой части может быть и что-то типа $a>45, но вот в левой только 1, если правое выполняется и 0, если не выполняется?
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
01.08.2016, 14:10
Цитата Сообщение от gnork Посмотреть сообщение
Не станет ли время всей этой проверки неприлично большим?
Не станет. Можете в цикле запустить и потестить)
Цитата Сообщение от gnork Посмотреть сообщение
Есть ли какие-то другие способы для таких случаев?
Надо искать закономерности, тогда можно будет составить некий свод правил и в цикле все вычислять.
Если закономерности нет, то придется все условия записывать вручную. Куча if выглядят некрасиво, я бы сгруппировал все это в массиве.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
01.08.2016, 14:11
Цитата Сообщение от gnork Посмотреть сообщение
Если я правильно понимаю, в правой части может быть и что-то типа $a>45, но вот в левой только 1, если правое выполняется и 0, если не выполняется?
да, так.
Если нужны другие значения, то можно
PHP
1
$res1 = ($a==1 && $b==1) ? 'истина' : 'ложь' ;
0
0 / 0 / 0
Регистрация: 01.08.2016
Сообщений: 3
01.08.2016, 14:42  [ТС]
Цитата Сообщение от Cra3y Посмотреть сообщение
PHP
1
$res1 = ($a==1 && $b==1) ? 'истина' : 'ложь' ;
Так это же вроде просто краткое написание if-then-else? Тогда мы вернулись к первоначальному перебору, просто короче записанному.

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

if(огромное условие){
что-то выполняется;
}

Возможно ли это это ОГРОМНОЕ УСЛОВИЕ поместить в отдельный file.php и каким-то образом подключать его (например, include или requier)?
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
30.01.2020, 21:58
Цитата Сообщение от gnork Посмотреть сообщение
Как организовать проверку множества условий с реакцией на каждую их комбинацию?
Очень понравилась задача. предлагаю такое решение:
создаем массив, это массив результатов проверок.
допустим, надо проверять $a>5, $b<100 && $b>5, $c<=0 и так дальше. но они в результате будут давать 0 или 1 (булевы значения).
создаем массив $tester = [$a>5, $b<100 && $b>5, $c<=0];
вычисляем итог проверок:
PHP
1
2
3
4
5
6
7
$res = 0;
for ($i = 0, $size = count($tester); $i < $size; $i++) {
    if ($tester[$i]) {//условие в данной позиции выполняется
        $bin = 2**$i;
        $res += $bin;
    }
}
затем можно в зависимости от состояния выбирать обработку
PHP
1
2
3
4
5
6
7
8
9
switch ($res)
{
case 0: ;//все неправильные
case 1: ;//только первый правильный
case 2: ;//только второй правильный
case 3: ;//второй и первый правильный
 
//и так далее
}
0
 Аватар для Строитель
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
30.01.2020, 22:14
Цитата Сообщение от misha_globus Посмотреть сообщение
Возможно ли это это ОГРОМНОЕ УСЛОВИЕ поместить в отдельный file.php и каким-то образом подключать его (например, include или requier)?
Да, но в файле с условиями нужно написать return значений. Например в основном файле код такой:
PHP
1
2
3
4
5
$filename = 'condition.php';
 
if (include $filename) {
    echo 'что-то выполняется';
}
А в файле с условиями - такой:
PHP
1
return 10 > 9 && 10 < 11;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.01.2020, 22:14
Помогаю со студенческими работами здесь

Существуют ли множества, удовлетворяющие набору условий? 2
1.2Существуют множества А В Х такие что выполняется набор условий ? P\N=N∩P=∅ P∩E≠∅

Множества. Проверка множества на наличие элемента в нем
Во многих задачах сталкиваюсь с одной и той же проблемой: Нужно создать множество элементов, добавлять в него новые элементы и проверять...

Существуют ли множества А, В, X такие, что выполняется набор условий?
Существуют ли множества А, В, X такие, что выполняется набор условий : B\X = A\X = (0), (0)-пустое множество и В не равна пустому...

Проверка условий
Здравствуйте, подскажите,пожалуйста, как прописать условия проверки. Мне нужно: если вводится радиус k больше одной из сторон, выводилось...

Проверка условий
Не пойму к чему тут != 0 ? Объясните пожалуйста не как не дойдет. class Condition { public static void main (String args) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru