Более чистый способ перевести индекс в указанную строку? - PullRequest
2 голосов
/ 18 ноября 2009

Могу ли я достичь этого более чистым способом? Было бы очень полезно.

    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;

    }

Спасибо! * * 1004

и сожалею о названии, не могу найти лучшего

Ответы [ 7 ]

10 голосов
/ 18 ноября 2009

Вы можете использовать массив вместо оператора switch.

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

Или

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

Лично я против повторного использования $ призвания для ссылки на два типа (целые и строковые), поскольку они, скорее всего, представляют собой два разных понятия в вашей программе.

Я бы также посоветовал вместо этого создать тип Enum для этих значений, но это зависит от контекста.

0 голосов
/ 18 ноября 2009

Другой вариант, который я здесь не видел, - хранить данные в таблице. Это поможет, если список станет огромным.

vocation_id        vocation_name
     1               sorcerer
     2                druid
    etc....

select vocation_name form vocations where vocation_id=3
0 голосов
/ 18 ноября 2009
0 голосов
/ 18 ноября 2009

Это дает ловушку для начальных значений призвания, не найденных в вашем списке.

$vocations = array(1=>"Sorcerer", 2=>"Druid", ...);
if (array_key_exists($vocation, $vocations)) {
  $vocation = $vocations[$vocation];
} else {
  $vocation = 'Not found';
}
0 голосов
/ 18 ноября 2009

Либо используя массив, как уже упоминалось, либо, по крайней мере, используя константы, а не простые целые числа в операторе 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;
}

Таким образом, добавление новых классов и рангов между классами немного проще.

0 голосов
/ 18 ноября 2009

Массив может работать для последовательных ключей, но в противном случае использовать ассоциативный массив (хеш).

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

РЕДАКТИРОВАТЬ: выше приведен синтаксис Perl, синтаксис PHP ниже:

$vocations = array(key1 => "value1", key2 => "value2", ...);
$vocationVal = $vocations[$vocationKey];
0 голосов
/ 18 ноября 2009

Ну, в зависимости от того, для чего вы это используете (не совсем уверен, что нет контекста), один из вариантов - сделать ваши призвания доступными в файле конфигурации (будь то XML, текстовый файл и т. Д.), Который можно прочитать. в системе на лету. Таким образом, если вы когда-нибудь захотите добавить дополнительное призвание, вы можете просто обновить текстовый файл, и вам не нужно перестраивать и / или повторно развертывать исходный код.

...