Як використовувати корпус комутатора 'або' в PHP


230

Чи існує спосіб використання оператора "АБО" або еквівалента в перемикачі PHP?

Наприклад, щось подібне:

switch ($value) {

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

Відповіді:


505
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

Я не переспитую інші відповіді, тому що вони всі правильні, але я просто додам, що ви не можете використовувати перемикач для більш "складних" висловлювань, наприклад: перевірити, чи значення "більше 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 () over switch () у цьому випадку. Цей вид комутатора просто додає складності, IMO.
пн

1
так, вам доведеться мати досить вагомий привід, щоб вибрати цей стиль, але добре знати, що це можливо.
нікф

2
Я насправді радий, що дізнався це. Кожен раз, коли я будую проект базовою мовою, я пропускаю C-стиль switch(), і коли я працюю на мові C-ish, я дійсно сумую за тим Select Case, що це дійсно короткий спосіб сказати "є великий блок if, else if, else-if ... тут ".
Стен Роджерс

5
you can't use switch for more "complicated" statementsце can'tчи це shouldn't? бо у своєму прикладі виcan
Шаркі

@Sharky він мав на увазі, що звичайний варіант використання перемикача не може. ця switch (true)річ не є звичайним випадком використання комутатора.
Чень Лі Йонг

37

Спробуйте з наступними прикладами в цій статті: http://phpswitch.com/

Можливі випадки перемикання:

(і). Проста заява про перемикання

Заява перемикача дивовижна і магія. Це фрагмент мови, який дозволяє вибирати між різними параметрами значення та запускати різні фрагменти коду залежно від того, яке значення встановлено.

Кожен можливий варіант задається випадком у операторі перемикача.

Приклад:

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

(іі). Розмежування кодових блоків

Основний застереження перемикача полягає в тому, що кожен випадок перейде в наступний, якщо ви не зупините його на перерві. Якщо простий випадок вище поширюється на 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) Використання переходу для кількох випадків

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

Приклад:

випадок 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(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.