Использование операторов сравнения в PHP-переключателе

Итак, у меня есть четыре условия, которые мне нужно пройти, и я подумал, что лучше всего использовать инструкцию switch в PHP. Однако мне нужно проверить, является ли целое число, допустим, меньше или равно, или больше и равно.

switch ($count) {
    case 20:
        $priority = 'low';
        break;

    case 40:
        $priority = 'medium';
        break;

    case 60:
        $priority = 'high';
        break;

    case 80:
        $priority = 'severe';
        break;
}

С помощью оператора if() он будет выглядеть следующим образом:

if ($count <= 20) {
    $priority = 'low';
}

if ($count <= 40) {
    $priority = 'medium';
}

Возможно ли это в switch-case?

Ответы

Ответ 1

Более общий случай решения этой задачи:

switch (true) {
    case $count <= 20:
        $priority = 'low';
        break;

    case $count <= 40:
        $priority = 'medium';
        break;

    case $count <= 60:
        $priority = 'high';
        break;

    default:
        $priority = 'severe';
        break;
}

Ответ 2

Нет. Операторы switch() предназначены для выполнения нескольких тестов на равенство. В основном это немного легче читать (но и более опасную) версию

if (x == 'a') { ... }
else if (x == 'b') { ... } 
else if (x == 'c') { ... }

код. Невозможно изменить switch() от == до < или любого другого оператора сравнения. Это строго для проверки равенства.

Ответ 3

Коммутаторы не могут этого сделать, но в этом конкретном случае вы можете сделать что-то вроде этого:

switch ((int)(($count - 1) / 20)) {
    case 0:
        $priority = 'low';
        break;
    case 1:
        $priority = 'medium';
        break;
    case 2:
        $priority = 'high';
        break;
    case 3:
        $priority = 'severe';
        break;
}

Итак, в (int)(($count - 1) / 20) все значения от 0 до 20 будут равны 0, от 21 до 40 будут иметь значение 1 и т.д., что позволит вам использовать оператор switch для этой цели.

И поскольку мы объединяем значения, мы можем даже упростить массив:

$priorities = ['low', 'medium', 'high', 'severe'];
$priority = $priorities[(int)(($count - 1) / 20)];

Ответ 4

Существует способ, который работает в php 7 с использованием трехмерных операторов присваивания. Оператор был введен ранее (5.4?), Но я никогда не тестировал код в других версиях. Я написал весь код переключения там, однако для краткости здесь есть только конкретное предложение. Пусть говорят, что мы хотим, чтобы условие соответствовало всем числам, большим или равным пяти:

switch($value){
 case ($value >= 5?$value:!$value)://do something here
 break;
}     

Мы либо разрешаем переменную $без изменений, либо отрицаем значение в соответствии с условием. Значение $всегда будет соответствовать самому себе или пропустить тест против его отрицания.