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

PHP-使用开关将字符串分配给变量的函数,php,arrays,switch-statement,assign,Php,Arrays,Switch Statement,Assign,我必须使用OOP创建一个函数,根据其他变量的值将字符串分配给变量。我在构造函数类中创建了这个函数(calculaIMC),为了实现它,我使用了一个数组($imc_arr)。我意识到我的代码可能看起来很麻烦,甚至可能不合适,但这是一个旨在教授特定内容的uni练习。到目前为止,我就是这么想的: <?php class CalculoIndice{ ... public $imc_arr = array( 'Magreza grave', 'Mag

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

<?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
表达式中添加条件
case
使用
switch()
语句中的表达式执行相等性测试,因此

case ($this->imc < 16):
实际上,有些程序员使用一种方法(但我个人并不赞同):

开关(真){
案例($this->imc<16):
$this->imc_cat=$this->imc_arr[0];
打破
案例($this->imc<17):
$this->imc_cat=$this->imc_arr[1];
打破
...
}

您不能将条件放入
大小写
表达式中
case
使用
switch()
语句中的表达式执行相等性测试,因此

case ($this->imc < 16):
实际上,有些程序员使用一种方法(但我个人并不赞同):

开关(真){
案例($this->imc<16):
$this->imc_cat=$this->imc_arr[0];
打破
案例($this->imc<17):
$this->imc_cat=$this->imc_arr[1];
打破
...
}

首先,您的switch语句看起来不正确,因为所有语句都等于true。您应该使用rage,即
$this->imc>0&&$this->imc<16
$this->imc>16&&$this->imc<18.5
$this->imc>18.5&&$this->imc<25
,首先,您的switch语句看起来不正确,因为所有语句都等于true。你应该使用rage,即
$this->imc>0&&$this->imc<16
$this->imc>16&$this->imc<18.5
$this->imc>18.5&$this->imc<25
非常感谢!这解决了我的问题。因为我认为我的错误很简单,在这种情况下,我没有正确理解“开关”是如何工作的。我在研究中看到了“真实”的方法,但它不起作用,可能是因为其他原因,然后我完全忘记了它。它正在工作。if/else解决方案可能更好,但考虑到这只是大学的一个练习,我将原封不动地离开。再次非常感谢!非常感谢你!这解决了我的问题。因为我认为我的错误很简单,在这种情况下,我没有正确理解“开关”是如何工作的。我在研究中看到了“真实”的方法,但它不起作用,可能是因为其他原因,然后我完全忘记了它。它正在工作。if/else解决方案可能更好,但考虑到这只是大学的一个练习,我将原封不动地离开。再次非常感谢!
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;
    ...
}