Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как уменьшить большое условие if?

эдик хайрутдинов Ученик (170), закрыт 5 лет назад
if ($contr_type == 0) {
if ($contr_doc_id != 4) {
if ($contr_doc_id == 1 && ($contr_ser_doc =~ /\D/g || $contr_num_doc =~ /\D/g)) {
if (!$contr_bday) {
$personal_data = '1. паспорт и дата рождения';
} else {
$personal_data = '2. паспорт';
}
} else {
if ($contr_ser_doc && $contr_num_doc && $contr_bday) {
$personal_data = 'Ок';
} elsif ((!$contr_ser_doc || !$contr_num_doc) && !$contr_bday) {
$personal_data = '1. паспорт и дата рождения';
} elsif ((!$contr_ser_doc || !$contr_num_doc) && $contr_bday) {
$personal_data = '2. паспорт';
} elsif (($contr_ser_doc && $contr_num_doc) && !$contr_bday) {
$personal_data = '3. дата рождения';
}
}
} else {
if (($contr_ser_doc || $contr_num_doc) && $contr_bday) {
$personal_data = 'ОК';
} elsif (!$contr_ser_doc && !$contr_num_doc && !$contr_bday) {
$personal_data = '1. паспорт и дата рождения';
} elsif ((!$contr_ser_doc && !$contr_num_doc) && $contr_bday) {
$personal_data = '2. паспорт';
} elsif (($contr_ser_doc || $contr_num_doc) && !$contr_bday) {
$personal_data = '3. дата рождения';
}
}
} elsif ($contr_type == 1) {
if ($contr_ip == 1) {
if ($contr_inn) {
$personal_data = 'Ок';
} else {
$personal_data = '2. Нет ИНН';
}
} else {
if ($contr_inn && $contr_kpp) {
$personal_data = 'Ок';
} elsif (!$contr_inn && $contr_kpp) {
$personal_data = '2. Нет ИНН';
} elsif ($contr_inn && !$contr_kpp) {
$personal_data = '3. Нет КПП';
} else {
$personal_data = '1. Нет ИНН и КПП';
}
}
}
Дополнен 5 лет назад
Всем доброго времени суток!
Есть большое условие, нужно уменьшить его до приемлемых размеров, несколько часов уже над ним сижу. Может кто помочь укоротить его при этом сохранив всю логику?
Лучший ответ
D P Мудрец (11157) 5 лет назад
Разбейте большое условие не несколько маленьких. Можно вынести их в отдельные функции по смыслу.
эдик хайрутдиновУченик (170) 5 лет назад
Дело не в разбитии на несколько маленьких, нужно избавиться от большого количества повторении в условии. Например таких как $personal_data = '1. паспорт и дата рождения'; встречается 3 раза.
Остальные ответы
Андрей Высший разум (425151) 5 лет назад
Открываем учебник булевой алгебры, изучаем законы де Моргана, осознаём, что:

(!$contr_ser_doc || !$contr_num_doc) == !($contr_ser_doc && $contr_num_doc)

Видим, что в блоке

if ($contr_ser_doc && $contr_num_doc && $contr_bday) {
$personal_data = 'Ок';
} elsif ((!$contr_ser_doc || !$contr_num_doc) && !$contr_bday) {
$personal_data = '1. паспорт и дата рождения';
} elsif ((!$contr_ser_doc || !$contr_num_doc) && $contr_bday) {
$personal_data = '2. паспорт';
} elsif (($contr_ser_doc && $contr_num_doc) && !$contr_bday) {
$personal_data = '3. дата рождения';
}

просто перечислены все варианты комбинаций значений $contr_bday и ($contr_ser_doc && $contr_num_doc).

И вся эта куча if сокращается до единственного выражения:

$personal_data = [['1. паспорт и дата рождения', '2. паспорт'], ['3. дата рождения', 'ОК']][$contr_ser_doc && $contr_num_doc][$contr_bday];

Или даже так:

$personal_data = ['1. паспорт и дата рождения', '2. паспорт', '3. дата рождения', 'ОК'][($contr_ser_doc && $contr_num_doc) * 2 + $contr_bday];
Похожие вопросы