将索引转换为指定字符串的清洁方法?

时间:2009-11-18 17:23:18

标签: php switch-statement

我能以更清洁的方式实现这一目标吗?会真的被批评。

    switch($vocation) {

        case 1: $vocation = "Sorcerer";        break;
        case 2: $vocation = "Druid";           break;       
        case 3: $vocation = "Paladin";         break;           
        case 4: $vocation = "Knight";          break;           
        case 5: $vocation = "Master Sorcerer"; break;           
        case 6: $vocation = "Elder Druid";     break;           
        case 7: $vocation = "Royal Paladin";   break;           
        case 8: $vocation = "Elite Knight";    break;

    }

谢谢!

抱歉标题无法找出更好的标题

7 个答案:

答案 0 :(得分:10)

您可以使用数组而不是switch语句。

$vocations = array("Sorcerer", "Druid" ...);
$vocationStr = $vocations[$vocation - 1];

或者

$vocations = array(1 => "Sorcerer", 2 => "Druid" ...);
$vocationStr = $vocations[$vocation];

就个人而言,我反对重复使用$ vocation来引用两种类型(整数和字符串),因为它们很可能是程序中的两个不同概念。

我还建议为这些值创建一个枚举类型,但这取决于上下文。

答案 1 :(得分:0)

那么,根据您使用它的原因(不确定没有上下文),一个选项是让您的可以在配置文件(可以是XML,文本文件等)中使用的可以读取在系统中即时。这样,如果您想要添加其他职业,您只需更新文本文件,而无需重建和/或重新部署您的来源。

答案 2 :(得分:0)

数组可以用于顺序键,但是否则使用关联数组(哈希)。

%vocations = array("key1"=>"value1", "key2"=>"value2", ...);
$vocationVal = $vocations{$vocationKey};

编辑:以上是perl语法,php语法如下:

$vocations = array(key1 => "value1", key2 => "value2", ...);
$vocationVal = $vocations[$vocationKey];

答案 3 :(得分:0)

使用已经提到的数组,或者至少使用constatants而不是switch语句中的普通整数。如下所示:

define("SORCERER", 1);
define("DRUID", 2);
...
define("RPALADIN", 7);
define("EKNIGHT", 8);

switch($vocation) {
    case SORCERER: $vocation="Sorcerer"; break;
    case DRUID: $vocation="Druid"; break;
    ...
    case RPALADIN: $vocation="Royal Paladin"; break;
    case EKNIGHT: $vocation="Elder Knight"; break;
}

这样在类之间添加新的类和排名就容易多了。

答案 4 :(得分:0)

这为您的列表中找不到的职业初始值提供了一个陷阱。

$vocations = array(1=>"Sorcerer", 2=>"Druid", ...);
if (array_key_exists($vocation, $vocations)) {
  $vocation = $vocations[$vocation];
} else {
  $vocation = 'Not found';
}

答案 5 :(得分:0)

答案 6 :(得分:0)

我在这里没有看到的另一个选项是将数据保存在表格中。如果列表变得庞大,它将有所帮助。

vocation_id        vocation_name
     1               sorcerer
     2                druid
    etc....

select vocation_name form vocations where vocation_id=3