使用PHP switch语句执行多个case

时间:2011-08-19 05:55:15

标签: php switch-statement

我必须根据一个值执行多组指令,例如。

$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的switch语句是否支持基于单个值执行多个案例?对此有什么解决方法吗?

谢谢..

6 个答案:

答案 0 :(得分:12)

如果缺少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;
}

答案 1 :(得分:3)

switch语句需要案例块中的文字。请改用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

注意: - 上述解决方案不正确,但输出您需要的不是正确的解决方案,如果可能,我建议避免。您可以使用非开关/案例替代方案轻松修复您的需求。

答案 2 :(得分:1)

解决方法是使用一组ifelse 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遇到{1}},执行将停在那里。

答案 3 :(得分:0)

在阅读文档后,我看到switch语句可能有多个案例,它们评估为true,但不是多个案例块,它们评估为真。

此外,文档指出break;范围内的continue;switch是等效的。

如果您遗漏所有break;continue;语句,您会看到无论是否匹配,它们都会打印出来。对于这个难题,你必须使用不太酷的if / else / ifelse语句。

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

答案 4 :(得分:0)

您需要像这样编写代码 当我们检查多个条件时,我们需要在那里添加条件语句。

$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;
}

答案 5 :(得分:-2)

CREATE OR ALTER PROCEDURE [dbo].[spCargarDatosCC]
AS
BEGIN
    SET NOCOUNT ON;

    -- VARIABLES --
    DECLARE @CCobro xml

    BEGIN TRY
        --Insercion de los tipos de documentos de identificacion
        SELECT @CCobro = CC
        FROM OPENROWSET (Bulk 'D:\Base de datos\FacturacionMunicipal_BD\Base de Datos\XML\Concepto_de_Cobro.xml', Single_BLOB) AS CCobro(CC)

        INSERT INTO CCobro (ID, Nombre, TasaInteresMoratorio, DiaEmisionRecibo, QDiasVencimiento, EsImpuesto, EsRecurrente, EsFijo, TipoCC, Activo)
        SELECT c.value('@id','INT') AS ID
            , c.value('@Nombre','VARCHAR(100)') AS Nombre
            , c.value('@TasaInteresMoratoria','DECIMAL(10,2)') AS TasaInteresMoratorio
            , c.value('@DiaCobro','TINYINT') AS DiaEmisionRecibo
            , c.value('@QDiasVencimiento','TINYINT') AS QDiasVencimiento
            , c.value('@EsImpuesto','VARCHAR(10)') AS EsImpuesto 
            , c.value('@EsRecurrente','VARCHAR(10)') AS EsRecurrente  
            , c.value('@EsFijo','VARCHAR(10)') AS EsFijo  
            , c.value('@TipoCC','VARCHAR(10)') AS TipoCC
            , 1 AS Activo
        FROM @CCobro.nodes('/Conceptos_de_Cobro/conceptocobro') AS t(c);

    END TRY

    BEGIN CATCH
        return @@ERROR * -1
    END CATCH
 END