簡體   English   中英

PHP:為什么我的交換機總是選擇相同的值?

[英]PHP: why my switch always picks the same value?

function getValue($v) {
        $b = 22;
        switch ($v) {
            case ($v <= $b * 1.2):
                $v1 = $b;   break;
            case ($v1 > $b * 1.2 && $v1 <= $b * 2.2):
                $v1 = $b * 2;   break;
            case ($v1 > $b * 2.2 && $v1 <= $b * 3.2):
                $v1 = $b * 3;   break;
            case ($v1 > $b * 3.2):
                $v1 = $b * 4;   break;
            default:
                $v1 = $b;
        }
        return $v1;
    }

getValue(25)getValue(45)始終返回22。

我認為您不能使用這樣的開關。 它需要價值。 它不接受布爾條件。 在這里檢查http://php.net/manual/en/control-structures.switch.php

function getValue($v) {
        $b = 22;
        switch ($v) {
            case ($v <= $b * 1.2):
                $v1 = $b;   break;
            case ($v > $b * 1.2 && $v <= $b * 2.2):
                $v1 = $b * 2;   break;
            case ($v > $b * 2.2 && $v <= $b * 3.2):
                $v1 = $b * 3;   break;
            case ($v > $b * 3.2):
                $v1 = $b * 4;   break;
            default:
                $v1 = $b;
        }
        return $v1;
    }

您錯誤地使用$v1而不是$v

上面的代碼將起作用。

您正在檢查錯誤的變量,因此在整個case語句中應將$v1替換$v1 $v 而且, switch語句被設計為接受常量值,因此最好將它們全部替換為if

另外,表達式的某些部分是多余的,因為您已經檢查了它們。 在檢查了$v <= $b * 1.2並發現它不是之后,無需在下一個表達式中檢查$v > $b * 1.2 您的default子句永遠無法匹配,因為$v 所有值均<= $b * 3.2> $b * 3.2

function getValue($v) {
    $b = 22;
    if ($v <= $b * 1.2) {
        return $b;
    } elseif ($v <= $b * 2.2) {
        return $b * 2;
    } elseif ($v <= $b * 3.2) {
        return $b * 3;
    } else {
        return $b * 4;
    }
}

使用switch ,您可以根據案例測試給定的值。

因此,您的語句確實執行$v == ($v <= $b * 1.2)$v == ($v1 > $b * 1.2 && $v1 <= $b * 2.2)等。

您可以進行切換並測試true

function getValue($v) {
    $b = 22;
    switch (true) {
        case ($v <= $b * 1.2):
            $v1 = $b;   break;
        case ($v1 > $b * 1.2 && $v1 <= $b * 2.2):
            $v1 = $b * 2;   break;
        case ($v1 > $b * 2.2 && $v1 <= $b * 3.2):
            $v1 = $b * 3;   break;
        case ($v1 > $b * 3.2):
            $v1 = $b * 4;   break;
        default:
            $v1 = $b;
    }
    return $v1;
}

但是在這種情況下, if / else似乎是更好的選擇:

function getValue($v) {
    $b = 22;
    if ($v <= $b * 1.2) {
        $v1 = $b;
    } elseif ($v1 > $b * 1.2 && $v1 <= $b * 2.2) {
        $v1 = $b * 2;
    } elseif ($v1 > $b * 2.2 && $v1 <= $b * 3.2) {
        $v1 = $b * 3;
    } elseif ($v1 > $b * 3.2) {
        $v1 = $b * 4;
    } else {
        $v1 = $b;
    }

    return $v1;
}

看一下您的案例標簽:它們是關系運算的結果,所以它們的總和為true或false! %v將與這些布爾值進行比較。 這就是為什么您在輸入案例中觀察到類似的輸出的原因。

if塊替換switch ,一切都會好起來。 並查看您對$v1的使用情況; 你是那個意思嗎

在您的開關中,我可以在第二,第三和第四種情況下看到變量$ v1,因此請考慮一下我們不通過第一種情況的情況,那么變量$ v1呢? 它尚未設置,因此總是默認情況或第一種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM