Выполнение нескольких случаев с помощью оператора переключения PHP - PullRequest
6 голосов
/ 19 августа 2011

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

$value = 'AA';
switch ($value) {
    case 'AA':
        echo "value equals  1";
    continue;
    case 'BB':
        echo "value equals 2";
    continue;
    case 'CC' || 'AA':
        echo "value equals 3";
    break;
}

Что я ожидаю от приведенного выше кода, так это то, что он должен выполнять несколько случаев на основе переданных значений, переменная $ value содержит AA в качестве значения, поэтому я ожидаю, что он выполнит оба

case 'AA' и
case 'CC' || 'AA'

, поэтому он должен распечатать value equals 1 value equals 3, однако он не выполняет его таким образом, что я получаю только value equals 1 в качестве вывода. и если я удаляю continue из оператора, он выполняет все три cases, что логически неверно. поддерживает ли оператор PHP несколько вариантов выполнения, основанных на одном значении? Есть ли обходной путь для этого?

спасибо ..

Ответы [ 5 ]

12 голосов
/ 19 августа 2011

Если break отсутствует, то оператор switch позволяет перейти к следующему условию:

$value = 'AA';
switch ($value) {
    case 'AA':
        echo "value equals  1"; // this case has no break, enables fallthrough
    case 'CC':
        echo "value equals 3"; // this one executes for both AA and CC
    break;
    case 'BB':
        echo "value equals 2";
    break;
}
3 голосов
/ 19 августа 2011

Оператор switch нуждается в литералах в блоках case. Вместо этого используйте операторы if.

Вы можете использовать другие виды циклов до iterate через значение, а затем использовать IF для сравнения. Выполнение сравнения / проверки состояния невозможно в switch случаях.

Один из способов выполнить то, что вы хотите сделать, это так (заметьте, что IF используется):

$value = 'AA';
switch($value)
{
    case ('AA'):
        echo "value equals 1<br />";
    case ('BB'):
        if ($value == 'BB'){
            echo "value equals 2<br />";
        }
    case (('AA') || ('CC')):
        echo "value equals 3<br />";
        break;
}

Выходы:

value equals 1
value equals 3

ПРИМЕЧАНИЕ: - вышеприведенное решение неверно, хотя выводит то, что вам нужно, не является правильным решением, и, если возможно, я бы рекомендовал избегать. Ваши нужды могут быть легко исправлены с помощью альтернатив, не связанных с коммутацией / кейсом.

1 голос
/ 19 августа 2011

Обходной путь - использовать набор операторов if и else if. Условия в case операторах не оцениваются.

if($value == 'AA') {
    echo "value equals 1";
}
else if($value == 'CC') {
    echo "value equals 3";
}
else { //Or else if($value == 'BB') if you might add more at some point
    echo "value equals 2";
}

Оператор continue (или break) заканчивается каждым case. Если он опущен, выполнение будет переходить к следующему case (именно поэтому все три выполняются в вашем случае - он проходит через все их, вплоть до конца. Если встречается continue или break в case, который был прерван, исполнение на этом остановится).

0 голосов
/ 27 июля 2014

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

$value = 'AA';
switch ($value) {
    case 'AA':
        echo "value equals  1";
    continue;
    case 'BB':
        echo "value equals 2";
    continue;
    case $value == 'CC' || $value=='AA':
        echo "value equals 3";
    break;
}

Или вы можете просто написать свой код в этом форматеразные случаи для этого)

$value = 'AA';
switch ($value) {
    case 'AA':
        echo "value equals  1";
    continue;
    case 'BB':
        echo "value equals 2";
    continue;
    case 'CC':
    case 'AA':
        echo "value equals 3";
    break;
}
0 голосов
/ 19 августа 2011

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

Кроме того, в документации говорится, что break; и continue; вобласть действия switch эквивалентна.

Если вы пропустите все операторы break; и continue;, вы увидите, что все они печатаются независимо от соответствия.Вам придется использовать менее классные операторы if / else / ifelse для этой головоломки.

http://php.net/manual/en/control-structures.switch.php

...