PHP - 使用 switch 将字符串分配给变量的函数

PHP - Function to assign a string to a variable with switch

我必须创建一个函数,根据使用 OOP 的其他变量的值将字符串分配给变量。我在构造函数 class 中创建了这个函数 (calculaIMC),为了实现这一点,我使用了一个数组 ($imc_arr)。我意识到我的代码可能看起来很麻烦,甚至可能不合适,但它是一个旨在教授特定事物的单向练习。这就是我到目前为止想出的:

<?php
class CalculoIndice{
    ...
    public $imc_arr = array(
        'Magreza grave',
        'Magreza moderada',
        'Magreza leve',
        'Saud&aacute;vel',
        'Sobrepeso',
        'Obesidade Grau I',
        'Obesidade Grau II (severa)',
        'Obesidade Grau III (m&oacute;rbida)');

    function CalculoIndice(){
        $this->preparaCalculo();
        $this->calculaIMC();
    }

    function preparaCalculo(){
        ...
    }

    function calculaIMC(){
        switch ($this->imc) {
            case ($this->imc < 16):
                $this->imc_cat = $this->imc_arr[0];
                break;
            case ($this->imc < 17):
                $this->imc_cat = $this->imc_arr[1];
                break;
            case ($this->imc < 18.5):
                $this->imc_cat = $this->imc_arr[2];
                break;
            case ($this->imc < 25):
                $this->imc_cat = $this->imc_arr[3];
                break;
            case ($this->imc < 30):
                $this->imc_cat = $this->imc_arr[4];
                break;
            case ($this->imc < 35):
                $this->imc_cat = $this->imc_arr[5];
                break;
            case ($this->imc < 40):
                $this->imc_cat = $this->imc_arr[6];
                break;
            default:
                $this->imc_cat = $this->imc_arr[7];
        }
    }
}
?>

它不工作。我不太清楚发生了什么以及问题是什么,但它并没有像我预期的那样回应变量 (imc_cat)。我确定我缺少的东西很简单,但我花了几个小时寻找答案但没有成功。 我很感激任何关于可能出错的见解。

您不要将条件放在 case 表达式中。 caseswitch() 语句中的表达式执行相等性测试,因此

case ($this->imc < 16):

表示

if ($this->imc == ($this->imc < 16))

您应该使用 if/elseif 而不是 switch/case

if ($this->imc < 16) {
    $this->imc_cat = $this->imc_arr[0];
} elseif ($this->imc < 17) {
    $this->imc_cat = $this->imc_arr[1];
} ...
} else {
    $this->imc_cat = $this->imc_arr[7];
}

其实有一种方法是一些程序员使用的(但我个人并不赞同):

switch(true) {
    case ($this->imc < 16):
        $this->imc_cat = $this->imc_arr[0];
        break;
    case ($this->imc < 17):
        $this->imc_cat = $this->imc_arr[1];
        break;
    ...
}