Как использовать регистр переключения 'или' в PHP


231

Есть ли способ использовать оператор «ИЛИ» или эквивалент в переключателе PHP?

Например, что-то вроде этого:

switch ($value) {

    case 1 || 2:
        echo 'the value is either 1 or 2';
        break;
}

Ответы:


506
switch ($value)
{
    case 1:
    case 2:
        echo "the value is either 1 or 2.";
    break;
}

Это называется «проваливать» блок корпуса. Этот термин существует в большинстве языков, реализующих оператор switch.


135

Если вы должны использовать ||с, switchто вы можете попробовать:

$v = 1;
switch (true) {
    case ($v == 1 || $v == 2):
        echo 'the value is either 1 or 2';
        break;
}

Если бы не ваше предпочтительное решение было бы

switch($v) {
    case 1:
    case 2:
        echo "the value is either 1 or 2";
        break;
}

Проблема в том, что оба метода не эффективны при работе с большими делами ... представьте, 1что 100это будет работать отлично

$r1 = range(1, 100);
$r2 = range(100, 200);
$v = 76;
switch (true) {
    case in_array($v, $r1) :
        echo 'the value is in range 1 to 100';
        break;
    case in_array($v, $r2) :
        echo 'the value is in range 100 to 200';
        break;
}

58

Я не буду публиковать другие ответы, потому что они все правильные, но я просто добавлю, что вы не можете использовать switch для более «сложных» утверждений, например: для проверки, если значение «больше 3», « между 4 и 6 "и т. д. Если вам нужно сделать что-то подобное, придерживайтесь ifинструкций с использованием или, если есть особенно острая необходимость, switchто вы можете использовать это назад:

switch (true) {
    case ($value > 3) :
        // value is greater than 3
    break;
    case ($value >= 4 && $value <= 6) :
        // value is between 4 and 6
    break;
}

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


1
Рад видеть, что вы рекомендовали if () через switch () в этом случае. Этот тип переключателя только добавляет сложности, IMO.
Moo

1
да, у вас должна быть достаточно веская причина, чтобы выбрать этот стиль, но приятно знать, что это возможно.
Ник

2
Я на самом деле рад, что узнал это. Каждый раз, когда я строю проект на языке Basic-y, мне не хватает стиля C switch(), и когда я работаю на языке C-ish, мне очень не хватает его Select Case, что на самом деле является кратким способом сказать: «есть большой блок if, else if, else-if ... here ".
Стэн Роджерс

5
you can't use switch for more "complicated" statementsэто can'tили это shouldn't? потому что в вашем примере выcan
Sharky

@ Шарки, он имел в виду, что обычный вариант использования switch не может. это switch (true)не обычный случай использования переключателя.
Чен Ли Ён

37

Попробуйте использовать следующие примеры в этой статье: http://phpswitch.com/

Возможные случаи переключения:

(я). Простое заявление о переключении

Положение переключателя удивительно и волшебно. Это часть языка, которая позволяет вам выбирать между различными опциями для значения и запускать разные фрагменты кода в зависимости от того, какое значение установлено.

Каждый возможный вариант задается регистром в операторе switch.

Пример :

switch($bar)
{
    case 4:
        echo "This is not the number you're looking for.\n";
        $foo = 92;
}

(II). Разграничение блоков кода

Главное предостережение переключателя заключается в том, что каждый случай будет переходить к следующему, если вы не остановите его с перерывом. Если простой случай выше распространен на случай 5:

Пример :

case 4:
    echo "This is not the number you're looking for.\n";
    $foo = 92;
    break;

case 5:
    echo "A copy of Ringworld is on its way to you!\n";
    $foo = 34;
    break;

(III). Использование Fallthrough для нескольких случаев

Поскольку switch будет продолжать выполнение кода до тех пор, пока не обнаружит перерыв, достаточно легко принять концепцию «сквозного» и запустить один и тот же код для более чем одного случая:

Пример :

случай 2:

case 3:
case 4:
    echo "This is not the number you're looking for.\n";
    $foo = 92;
    break;

case 5:
    echo "A copy of Ringworld is on its way to you!\n";
    $foo = 34;
    break;

(IV). Расширенное переключение: условия

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

Пример :

switch(true)
{
    case (strlen($foo) > 30):
        $error = "The value provided is too long.";
    $valid = false;
    break;

    case (!preg_match('/^[A-Z0-9]+$/i', $foo)):
        $error = "The value must be alphanumeric.";
    $valid = false;
    break;

    default:
    $valid = true;
    break;
}

Я думаю, что это может помочь вам решить вашу проблему.


Есть ли у вас пример использования в реальном мире для примера (iv)?
Педро Морейра

15

Пытаться

switch($value) {
    case 1:
    case 2:
        echo "the value is either 1 or 2";
        break;
}

9

Я предлагаю вам пройти через http://php.net/manual/en/control-structures.switch.php (руководство)

switch ($your_variable)
{
    case 1:
    case 2:
        echo "the value is either 1 or 2.";
    break;
}

объяснение

Как и в случае значения «что» для выполнения одного оператора, вы можете поместить его без перерыва, так как до или до тех пор, пока не будет найден разрыв, он продолжит выполнение кода, и если разрыв будет найден, он выйдет из случая переключателя.


1

используйте этот код:

switch($a) {
case 1:
case 2:
    .......
    .......
    .......
    break;
}

блок называется как 1, так и 2.




-4

Лучший способ может быть, если еще с запросом. Кроме того, это может быть проще и понятнее в использовании.

Пример:

<?php 
$go = $_REQUEST['go'];
?>
<?php if ($go == 'general_information'){?>
<div>
echo "hello";
}?>

Вместо использования функций, которые не будут хорошо работать с PHP, особенно если у вас есть PHP в HTML.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.