用表驱动方法替换switch-case语句

时间:2014-10-30 10:19:21

标签: php refactoring table-driven

我正在重构一些使用switch-case语句在A和B之间进行转换的现有代码,它看起来像这样:

<?php
function string2num($s)
{
    switch($s){
        case 'AB':
            return 1;
        case 'CD':
        case 'GH':
            return 2;
        case 'EF':
            return 3;
        ...
    }
}

function num2String($n)
{    
    switch($n){
        case 1:
            return 'AB';
        case 2:
            return array('CD', 'GH');
        ...
    }

}

它有太多的情况,导致大量代码,现在,我想用table driven approach执行此操作,但问题是,当我为string2num()构建表时:{ {1}},我无法重复$table = array('AB' => 1, 'CD' => 2, 'GH' => 2, 'EF' => 3, ...);中的表格(我的意思是num2String(),然后使用它),因为array_flip($table)中的重复值在翻转时只会成为一个键。我知道我可以用2张桌子来做,有人有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

像这样创建表:

$table = array(
    'AB' => 1,
    'CD' => 2,
    'GH' => 2,
    'EF' => 3,
);

您可以使用带有可选搜索参数的array_keys()函数检索多个密钥,因此

$keys = array_keys($table, 2);

将返回

array('CD', 'GH');

解决方案:

$table = array(
    'AB' => 1,
    'CD' => 2,
    'GH' => 2,
    'EF' => 3,
);

function string2num($table, $string) {
    if(isset($table[$string])) {
        return $table[$string]; 
    }
}

function num2String($table, $number) {    
    return array_keys($table, $number);

}