【问题标题】:Cleaner way to translate index into specified string?将索引转换为指定字符串的更简洁方法?
【发布时间】:2009-11-18 17:23:18
【问题描述】:

我能否以更简洁的方式实现这一目标?真的会被应用。

    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;

    }

谢谢!

很抱歉标题找不到更好的标题

【问题讨论】:

  • 将它们放在一个数组中,$vocations,并使用 $vocation:$vocations[$vocation - 1](类似的东西)索引该数组。

标签: php switch-statement


【解决方案1】:

您可以使用数组代替 switch 语句。

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

或者

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

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

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

【讨论】:

  • 我喜欢这种方法,但我可能会指定索引而不是使用“减一”的东西:array(1=>"Sorcerer", 2=>"Druid",... )。这样您就不会被自动索引卡住——如果您决定以后删除或跳过一个怎么办?
【解决方案2】:

好吧,取决于您使用它的目的(不确定,因为没有上下文),一种选择是在可以读取的配置文件(XML、文本文件等)中提供您的职业由系统在运行中。这样,如果您想添加额外的职业,您只需更新文本文件,而无需重建和/或重新部署您的源代码。

【讨论】:

    【解决方案3】:

    或者使用前面提到的数组,或者至少在 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】:

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

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

      【讨论】:

        【解决方案5】:
        【解决方案6】:

        数组可以用于顺序键,但否则使用关联数组(散列)。

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

        编辑:上面是perl语法,下面是php语法:

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

        【讨论】:

        • 除了array(...),都是perl。
        【解决方案7】:

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

        vocation_id        vocation_name
             1               sorcerer
             2                druid
            etc....
        
        select vocation_name form vocations where vocation_id=3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-28
          • 2015-12-15
          • 1970-01-01
          • 2016-01-16
          • 2017-08-16
          • 2010-12-21
          相关资源
          最近更新 更多