映射数组的最佳方法是什么,不允许未来的开发人员搞砸它?

时间:2011-01-24 21:31:45

标签: php arrays map

假设我有一个数组array('VI', 'MC', 'AE')和一个数组array('V', 'M', 'E')我想要映射数组,以便稍后如果我得到VI的数据,我可以使用它来获得V.我使用了array_map函数来做到这一点。但是,如果有人稍后进入并更改了我的第一个数组的顺序或者添加了一个并且不更改第二个数组,那么它可能会使映射陷入困境。处理此问题的最佳方法是确保将来不会出现任何错误。

以下是我的代码示例。有一点需要注意,我已对数组进行了硬编码,但这些数据实际上是从配置值中获取的方法中获取的,所以是的,它只是在方法中正确定义了两个数组

 private function _getMethodFromMageType($mageType){
    $origCCTypes =  array('VI', 'MC', 'AE');
    $newCCTypes = array('V', 'M', 'E');
    $typesMap = array_map(array(&$this, 'mapCCTypes'), $origCCTypes, $newCCTypes);

    foreach ($typesMap as $key => $map){
        if($map[$origType]){
            return $map[$origType];
        }
    }
}

这是我对array_map函数的回调函数

private function mapCCTypes($ccTypes1, $ccTypes2){
    return (array($ccTypes1 => $ccTypes2));
}

4 个答案:

答案 0 :(得分:2)

只有一个数组以明确的方式直接存储映射:

$CCTypes = array('VI' => 'V', 'MC' => 'M', 'AE' => 'E');

答案 1 :(得分:1)

嗯,这有点难看,但是如果你担心它,你可以通过硬编码当前的已知映射并使用优先于订单的那些来使代码更能抵抗修改配置列表的顺序基于可用的映射:

private $ccStaticMap = array(
    'VI' => 'V',
    'MC' => 'M',
    'AE' => 'E',
);

private function _getMethodFromMageType($origType) {
    $origCCTypes = pullOrigTypesFromConfig();
    $newCCTypes = pullNewTypesFromConfig();
    foreach($this->ccStaticMap as $key => $val) {
        while(($ix = array_search($key, $origCCTypes)) !== false)
            unset($origCCTypes[$ix]);
        while(($ix = array_search($val, $newCCTypes)) !== false)
            unset($newCCTypes[$ix]);
    }
    $typesMap = $this->ccStaticMap;
    for($ix = 0; $ix < min(count($origCCTypes), count($newCCTypes)); $ix++)
        $typesMap[$origCCTypes[$ix]] = $newCCTypes[$ix];
    return isset($typesMap[$origType]) ? $typesMap[$origType] : null;
}

答案 2 :(得分:0)

a)你为什么不array_combine?如果我正确理解它的作用,这比你的array_map方法更简单。

b)为什么不立刻使用关联数组?

答案 3 :(得分:0)

如果您的映射来自配置文件,我不确定您是否可以避免这种情况。你总是可以弄乱配置文件(然后你必须在某处保存原始映射以查看它是否已经搞砸了)。也许您需要改进配置解析或声明过程,以便始终必须声明某种关联数组,例如在INI文件中:

mappings.VI = V
mappings.MC = M
mappings.AE = E

$data = parse_ini_file("file.ini");
$mappings = $data['mappings'];