КЗ
Кристина Закоян

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

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. Нет ИНН и КПП';
}
}
}

Всем доброго времени суток!
Есть большое условие, нужно уменьшить его до приемлемых размеров, несколько часов уже над ним сижу. Может кто помочь укоротить его при этом сохранив всю логику?

Марина Стененкова
Марина Стененкова

Разбейте большое условие не несколько маленьких. Можно вынести их в отдельные функции по смыслу.

СС
Сергей Свитко

Открываем учебник булевой алгебры, изучаем законы де Моргана, осознаём, что:

(!$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];

Похожие вопросы
как уменьшить нос в домашних условиях?
Паскаль. Можно в if-then-else после if писать два раза or? а условие какой-нибудь буквой заменять?
как визуально уменьшить большой нос?
Как уменьшить сиськи? в домашних условиях? Надо срочно
Можно ли уменьшить язык, а то он большой и давит на зубы?
Можно ли в Visual Basic писать условия If через And?
Как уменьшить член в домашних условиях без ножа ?
Что значит это условие на Перл?
Нужна математическая формула, высчитать стоимость минут, при условии что 60 минут = 200 рублей
В чем отличия условий if и elif?