Использование операторов сравнения в 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;
}
Мы либо разрешаем переменную $без изменений, либо отрицаем значение в соответствии с условием. Значение $всегда будет соответствовать самому себе или пропустить тест против его отрицания.