2013-04-03 162 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