Как снизить цикломатическую сложность коммутатора с 11 корпусами

Я должен проверить, находится ли значение в пределах диапазона (0..9, 10..19 .. до 100) и вернуть значение в зависимости от диапазона. Цикломатическая сложность моей функции равна 12, и мне нужно снизить ее как минимум до 9.
Я действительно в растерянности здесь.

Я хотел использовать ассоциативный массив (для использования в качестве словаря или хэш-таблицы), но я не думаю, что он работает с диапазонами, и я не хочу, чтобы массив был явно объявлен с 100 записями!

$value = 23;
switch(true) {
case in_array($value, range(0,9)):
return -10;
break;
case in_array($value, range(10,19)):
return -7;
break;
case in_array($value, range(20,29)):
return -5;
break;
case in_array($value, range(30,39)):
return 3;
break;
case in_array($value, range(40,49)):
return 4;
break;
case in_array($value, range(50,59)):
return 5;
break;
case in_array($value, range(60,69)):
return 6;
break;
case in_array($value, range(70,79)):
return 7;
break;
case in_array($value, range(80,89)):
return 8;
break;
case in_array($value, range(90,99)):
return 9;
break;
case in_array($value, range(100,100)):
return 10;
break;
default:
return 0;
break;
}

Может кто-нибудь помочь? Есть ли более простой способ сделать это?
ТИА

0

Решение

Вы можете просто использовать целочисленное деление, если число больше 30. Вам также не нужно break; если вы возвращаетесь, так как это уже остановит выполнение кода.

switch(true) {
case in_array($value, range(0,9)):
return -10;
case in_array($value, range(10,19)):
return -7;
case in_array($value, range(20,29)):
return -5;
case in_array($value, range(30,100)):
return intdiv($value, 10);
default:
return 0;
}
0

Другие решения

Поскольку шаги выполняются регулярно каждые 10, вы можете выполнить целочисленное деление на 10 и найти соответствующие значения в массиве:

function theFunc(int $i)
{
return ($i<0 || $i>100) ? 0 : [-10, -7, -5, 3, 4, 5, 6, 7, 8, 9, 10][(int)($i/10)];
}

for($i = -1 ; $i <= 101 ; $i++)
var_dump([$i, theFunc($i)]);
1