2014-10-30 35 views
0

我重构一些现有的代码中使用的switch-case语句A和B之间它转换,它看起来像这样:更换开关-case语句与表驱动方式

<?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()创建表时:$table = array('AB' => 1, 'CD' => 2, 'GH' => 2, 'EF' => 3, ...);,我无法重用num2String()中的表(我的意思是,array_flip($table),然后使用它),因为$table中的重复值在翻转时将成为唯一的一个键。我知道我可以用两张桌子做到这一点,有人有更好的解决方案?

回答

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

} 
+0

谢谢,从未使用'array_keys()'之前:) – jfly 2014-10-31 01:59:05