2013-04-03 126 views

回答

0

我这样做了一次将值放入2个数组。如果keySet()和valueSet()是分离的,你甚至可以使用一个值。例如:

$mapKtoV = array(); 
$mapVtoK = array(); 

function putInMap ($key,$value) 
{ 
    $mapKtoV[$key] = $value; 
    $mapVtoK[$value] = $key; 
} 

当然你也可以把它们放到一个类中。

你是否也认为这个解决方案看起来有点d and和气味?是的,真的,欢迎来到PHP世界,这通常是由糟糕的代码设计所主导。如果你真的想找一个好的解决方案,你应该实际将你的源码从PHP移植到Java;)

希望它有帮助。

+1

这不会实际实现双向地图(没有额外的检查)。你可以放入'(1,1)','(1,2)'没有错误。 – dtech

2

这个类应该提供一个双向映射的大部分需求:

class BiMap 
{ 

    private $KtoV, $VtoK; 

    public function __constructor() 
    { 
     $this->KtoV = []; // for version < 5.4.0, syntax must be: $this->KtoV = array(); 
     $this->VtoK = []; 
    } 

    public function getKey($v) 
    { 
     if($this->hasValue($v)) 
     { 
      return $this->VtoK[$v]; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    public function getAllKeys() 
    { 
     if($this->KtoV) 
     { 
      return array_keys($this->KtoV); 
     } 
     else 
     { 
      return $this->KtoV; 
     } 
    } 

    public function getValue($k) 
    { 
     if($this->hasKey($k)) 
     { 
      return $this->KtoV[$k]; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    public function getAllValues() 
    { 
     if($this->VtoK) 
     { 
      return array_keys($this->VtoK); 
     } 
     else 
     { 
      return $this->VtoK; 
     } 
    } 

    public function hasKey($k) 
    { 
     return isset($this->KtoV[$k]); 
    } 

    public function hasValue($v) 
    { 
     return isset($this->VtoK[$v]); 
    } 

    public function put($k, $v) 
    { 
     if($this->hasKey($k)) 
     { 
      $this->removeKey($k); 
     } 
     if($this->hasValue($v)) 
     { 
      $this->removeValue($v); 
     } 
     $this->KtoV[$k] = $v; 
     $this->VtoK[$v] = $k; 
    } 

    public function putAll($array) 
    { 
     foreach($array as $k => $v) 
     { 
      $this->put($k, $v); 
     } 
    } 

    public function removeKey($k) 
    { 
     if($this->hasKey($k)) 
     { 
      unset($this->VtoK[$this->KtoV[$k]]); 
      $v = $this->KtoV[$k]; 
      unset($this->KtoV[$k]); 
      return $v; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    public function removeValue($v) 
    { 
     if($this->hasValue($v)) 
     { 
      unset($this->KtoV[$this->VtoK[$v]]); 
      $k = $this->VtoK[$v]; 
      unset($this->VtoK[$v]); 
      return $k; 
     } 
     else 
     { 
      return null; 
     } 
    } 

} 

不过,如果你需要的键/值和/或对象/数组检查,然后处理类似下面的行空检查的代码应在一个函数的体发出,而hasKey($k)hasValue($v)put($k, $v)方法内适当称为:

if($item === null) 
    { 
     throw new Exception('null as BiMap key/value is invalid.'); 
    } 
    if(is_object($item) || is_array($item)) 
    { 
     throw new Exception('Object/Array as BiMap key/value is invalid.'); 
    } 
+0

更好的方式来检查输入值的健全性将使用['is_scalar'](http://php.net/manual/en/function.is-scalar.php)。 – faintsignal