Существуют ли сокращенные операторы переключения (в PHP)?

Я хочу сравнить одну и ту же переменную (или выражение) со многими различными значениями и вернуть другое значение в зависимости от того, какому значению оно равно. я хочу сделать это встроенный или сокращенный, как это возможно с if заявление.

Возьмите следующее switch заявление:

switch($color_name) {
case 'red':
case 'blue':
$color_type = handlePrimaryColor($in);
break;
case 'yellow':
case 'cyan':
$color_type = handleSecondaryColor($in);
break;
case 'azure':
case 'violet':
$color_type = handleTertiaryColor($in);
break;
default:
$color_type = null;
break;
}

Я не люблю писать $color_type = в каждом случае и хотел бы найти способ сделать это с меньшим количеством кода.

Я мог бы сделать это с помощью некоторой формы сокращенного синтаксиса. Ниже я использую стенография if заявление назначить значение переменной в том же месте, где оно было впервые объявлено:

$color_type = $color_name == 'red' || $color_name == 'blue'
? handlePrimaryColor($color_name)
: ($color_name == 'yellow' || $color_name == 'cyan'
? handleSecondaryColor($color_name)
: ($color_name == 'azure' || $color_name == 'violet'
? handleTertiaryColor($color_name)
: null
)
);

Этот метод не требует объявления переменной внутри каждой конструкции, но вместо этого дает мне 2 новые проблемы:

  • Теперь я должен написать новый OR условие для каждого цвета
  • Каждая группа условий добавляет дополнительный уровень вложенности

Мой вопрос: есть ли метод, который позволяет мне напрямую присваивать значение переменной, используя сокращенный синтаксис, который ведет себя как переключатель?

Если нет, мне было бы интересно узнать, почему существует такое ограничение.

3

Решение

Слишком много работы. Используйте таблицу отправки.

$color_dispatch = Array(
'red' => 'handlePrimaryColor',
'blue' => 'handlePrimaryColor',
...
);

$color_type = null;
if (array_key_exists($color_name, $color_dispatch))
{
$color_type = $color_dispatch[$color_name]($in);
}
5

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

Других решений пока нет …

По вопросам рекламы [email protected]