如何避免冗余;否则”;(if/else)在我的交换机机箱中


How to avoid redundant "else" (if/else) within my switch cases

如果删除If/else函数中的"else",即使If语句返回false,$on_sal变量也会由于某种原因更改为"true"。

$mm = date('n');
$on_sale = false;
foreach ($services as $service) {
    switch ($service) {
        case 'Example Service':
            if ($mm == 3 || $mm == 4) { #pretend this returns false
                $service = '1% Off ' .$service;
                $on_sale = true;
            } else {
                $on_sale = false; #<---- why must I do this?
            }
            break;
        default:
            $service;
            $on_sale = false;
            break;
    }
    #more code...
}

我期望的工作:

$mm = date('n');
$on_sale = false;
foreach ($services as $service) {
    switch ($service) {
        case 'Example Service':
            if ($mm == 3 || $mm == 4) { #pretend this returns false
                $service = '1% Off ' .$service;
                $on_sale = true;
            }
            break;
        default:
            $service;
            $on_sale = false;
            break;
    }
    #more code...
}

编辑:

我错误地在foreach循环之外声明了我的$on_sall变量,所以对于每次迭代,$on_sal变量都没有"重置"。

错误:

$mm = date('n');
$on_sale = false;
foreach ($services as $service) {
   ...

好:

$mm = date('n');
foreach ($services as $service) {
    $on_sale = false;
    ...

(这可能不是一个好答案,但您可能会学到一些关于交换机的知识。)

我不确定default情况下的$service;应该做什么,但是:

您通过(重新)移动break语句:,使一个案例流血到下一个案例

switch (x) {
    case a:
        do A
        // don't break
    case b:
        do B
        break;
}

对于a,这将使do Ado B"与",因为case a不会停止。对于b,这将仅为do B

在您的情况下:

switch ($service) {
    case 'Example Service':
        if ($mm == 3 || $mm == 4) { #pretend this returns false
            $service = '1% Off ' .$service;
            $on_sale = true;
            break; // BREAK HERE
        }
        // DON'T BREAK HERE
    default:
        $service; // ??
        $on_sale = false;
        break;
}