2009-04-29 5 views
3

Comment puis-je re-factoriser le code suivant pour le rendre plus concis et plus maintenable?Comment mapper une valeur entière à une chaîne plus facilement en PHP?

if ($row['vocation'] == 1) $vocation = "sorcerer"; 
if ($row['vocation'] == 2) $vocation = "druid"; 
if ($row['vocation'] == 3) $vocation = "paladin"; 
if ($row['vocation'] == 4) $vocation = "knight"; 

if ($row['vocation'] == 5) $vocation = "master sorcerer"; 
if ($row['vocation'] == 6) $vocation = "elder druid"; 
if ($row['vocation'] == 7) $vocation = "royal paladin"; 
if ($row['vocation'] == 8) $vocation = "elite knight"; 
else $vocation = "none"; 
+0

oooh J'espère que le demandeur original peut trouver cette question encore, n'a pas pensé à cela quand j'ai changé le titre – thomasrutter

Répondre

17

Je recommande l'utilisation d'un tableau, comme ceci:

static $vocations = array(
    1 => 'sorceror', 
    2 => 'druid', 
    3 => 'paladin', 
    4 => 'knight', 
    5 => 'master sorceror', 
    6 => 'elder druid', 
    7 => 'royal paladin', 
    8 => 'elite knight', 
); 

$vocation = 
    isset($vocations[$row['vocation']]) ? $vocations[$row['vocation']] : 'none'; 
+0

Ceci, avec le commentaire ajouté que si ceux-ci viennent d'une base de données, vous pourriez être mieux de le stocker dans une table Vocations et rejoindre il. – Mark

+0

+ 1 Bel exemple, je vais vous céder celui-ci;] –

0

Démarrez votre projet à droite, utilisez const maintenant pour représenter les constantes numériques et vous éviter d'éventuels problèmes sur la ligne. (En plus de l'aide du commutateur/cas comme d'autres l'ont suggéré)

2

Voici un exemple de utilisé un interrupteur pour le faire:

switch ($row['vocation']) { 
    case 1: 
     $vocation = "sorcerer"; 
     break; 
    case 2: 
     $vocation = etc.. 
    default: 
     $vocation = "none"; 
} 

Ceci est une chose commune pour de nombreuses langues comme C, Java et C# et beaucoup d'autres aussi.

+0

+1 pour l'exemple, mais rien qui bousille la lisibilité du code est une amélioration, à moins que les cas deviennent nettement plus compliqués que la définition de $ vocation. – Mark

1

La pièce suivante pourrait être un peu mieux. 8 éléments sont OK, mais si la liste contenait des 1000.

$list = array("sorcerer", "druid", ...); 

$vocation = "none"; 

if($row['vocation'] <= count($list)){ 
    $vocation = $list[$row['vocation'] - 1]; 
} 
0

J'utilise la suggestion avec tableau et j'utiliser des constantes pour représenter les valeurs entières comme ceci:

define('VOCATION_SORCEROR', 1); 
define('VOCATION_DRUID', 2); 
define('VOCATION_PALADIN', 3); 

$vocations = array(
    VOCATION_SORCEROR => 'sorceror', 
    VOCATION_DRUID => 'druid', 
    VOCATION_PALADIN => 'paladin' 
); 
Questions connexes