在PHP中,如何更容易地将整数值映射为字符串?

在PHP中,如何更容易地将整数值映射为字符串?,php,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)

我如何重新考虑以下代码,使其更简洁、更易于维护

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";

我建议使用如下数组:

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';
define('VOCATION_SORCEROR', 1);
define('VOCATION_DRUID',    2);
define('VOCATION_PALADIN',  3);

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

正确地开始您的项目,使用const now来表示这些数值常量,并为自己省去一些后顾之忧。(除了像其他人建议的那样使用switch/case之外)

下面是一个使用switch来完成此操作的示例:

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

这对于C、Java、C#等许多语言以及其他许多语言来说都很常见。

下面的文章可能会更好一些。8个元素是可以的,但是如果列表包含1000个元素呢

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

$vocation = "none";

if($row['vocation'] <= count($list)){
    $vocation = $list[$row['vocation'] - 1];
}
$list=array(“魔法师”、“德鲁伊”…);
$cavity=“无”;

如果($row['cavity'],我会将建议与数组一起使用,并使用常量来表示整数值,如下所示:

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';
define('VOCATION_SORCEROR', 1);
define('VOCATION_DRUID',    2);
define('VOCATION_PALADIN',  3);

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

还有一个建议:

<?php

class Action
{
    const TYPE__ADD = 0;
    const TYPE__VIEW = 1;
    const TYPE__EDIT = 2;
    const TYPE__PATCH = 3;
    const TYPE__DELETE = 4;
    const TYPE__MAP = [
        self::TYPE__ADD => 'add',
        self::TYPE__VIEW => 'access',
        self::TYPE__EDIT => 'edit',
        self::TYPE__PATCH => 'patch',
        self::TYPE__DELETE => 'delete'
    ];

    protected $type;

    public function setType(int $type)
    {
        if (!isset(self::TYPE__MAP[$this->type])) throw new \Exception(sprintf('Invalid type. Possible options are: %s.', implode(',', self::TYPE__MAP)));

        $this->type = $type;
    }

    public function getType(): int
    {
        return $this->type;
    }

    public function getTypeStr(): string
    {
        return self::TYPE__MAP[$this->type];
    }
}

// Test
$action = new Action();
$action->setType(Action::TYPE__PATCH);
echo 'Action type is: '.$action->getTypeStr().', and its representative int value is: '.$action->getType();

这一点,加上一条注释,如果这些数据来自数据库,您可能会更好地将其存储在一个休假表中并将其连接起来。+1作为示例,但不会影响代码的可读性是一种改进,除非情况变得比设置$vocation复杂得多。噢,我希望原始的asker可以再次找到这个问题,当我更改标题时没有考虑到这一点