Много If-ов - нормально?

86
02 апреля 2022, 15:20

Написал порядка полусотни if-ов для проверки и присваивания существования значений переменным вида

if (!$key1) $var1 = "нет данных";
else var1 = "Значение_1";
if (!$key2) $var1 = "нет данных";
else var2 = "Значение_2";
...
if (!$keу50) $var50 = "нет данных";
else var50 = "Значение50";

Т.е по умолчанию всем переменным присваивается значение "нет данных"

Насколько такие конструкции некрасивы (говнокод?) и как правильнее делать?

PS. keyN предварительно достаю из базы, а varN в дальнейшем уходит в массив.

Добавка: Прошу прощения, я не учел как оказалось важный момент:

Все имена переменных - как ключей, так и значений - уникальны и не поддаются цифровой "маркировкой". В реальности эти имена типа $saper_resolution_key, $desar_price_key, $insment_rate_var и тп. А значения к тому же ещё и не одинакового формата - где-то просто текст, где-то конкатенация с переменными, причём в разном порядке и наборах.
Поэтому формирование предварительного массива мне кажется ещё более проблемно, а последующая его обработка и вовсе запутает.

И по просьбам из коментариев привожу кусочек реального кода

if (rwmb_meta('deres-reser','',$post_id)==0)  $deres_reser_var = "Нет";
else $deres_reser_var = "Да";
if (!rwmb_meta('ssumnal-minsumm','',$post_id)) $ssumnal_minsumm_var = "нет данных";
else $ssumnal_minsumm_var = rwmb_meta('ssumnal-minsumm','',$post_id)." руб";
if (!rwmb_meta('sader-age','',$post_id)) $sader_age_var = "нет данных"; 
else $sader_age_var = "От".rwmb_meta('sader-age','',$post_id)." лет";
if (!rwmb_meta('fasan-servise','',$post_id)) $fasan_servise_var = "нет данных";
else $fasan_servise_var = rwmb_meta('fasan-servise','',$post_id);   

тут функция rwmb_meta('fasan-servise','',$post_id)) получает из базы значения поля с именем fasan-servise

А в дальнейшем из этих данных я составлю массив и передаю его в обработку

$arr = array ( $deres_reser_key => $deres_reser_var, $ssumnal_minsumm_key => $ssumnal_minsumm_var , $sader_age_key => $sader_age_var, $fasan_servise_key => $fasan_servise_var);

(В этом массиве на переменные ключей не обращайте внимания - в данном случае они не играют роль и я упростил для понимания логики их именований)

Answer 1

На самом деле есть не мало вариантов реализции подобного кода. Для приведенного в примере кода лучше использовать тернарный оператор:

$var1 = $key1 ? 'Значение1' : 'нет данных';
$var2 = $key2 ? 'Значение2' : 'нет данных';
$var3 = $key3 ? 'Значение3' : 'нет данных';
$var50 = $key50 ? 'Значение50' : 'нет данных';

Второй вариант, если уместно, положить всё в массив и обойти его циклом:

$keysArray = [$key1, $key2, $key3, $key50];
$valuesArray = [];
$i = 1;
foreach ($keysArray as $key) {
    $valuesArray[] = $key ? 'Значение' . $i++ : 'нет данных';
}

В общем, способов избавиться от if-else достаточно.

Answer 2
// Функция вернет $value в случае успеха и $failValue - неудачи    
function getValue($key, $value, $failValue='нет данных') {
    return $key? $value: $failValue;
}
$var1 = getValue($key1, 'значение 1')
$var2 = getValue($key2, 'значение 2')
$var3 = getValue($key3, 'значение 3')

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

READ ALSO
Реализация покупки товара с сайта

Реализация покупки товара с сайта

Будьте добры подсказатьЯ хочу реализовать покупку товара с сайта,но не знаю как конкретно это делается

80
Функция array_rand() в PHP

Функция array_rand() в PHP

Всем приветРешил попробовать написать бота

113