我向PHP移植了一段使用大量雙向映射的Java代碼(Guava's BiMap)。類似Java的地圖由PHP數組或SplObjectStorage提供,但是有沒有可用的PHP PHP雙向地圖?PHP雙向映射
Q
PHP雙向映射
1
A
回答
0
我這樣做了一次將值放入2個數組。如果keySet()和valueSet()是分離的,你甚至可以使用一個值。例如:
$mapKtoV = array();
$mapVtoK = array();
function putInMap ($key,$value)
{
$mapKtoV[$key] = $value;
$mapVtoK[$value] = $key;
}
當然你也可以把它們放到一個類中。
你是否也認爲這個解決方案看起來有點d and和氣味?是的,真的,歡迎來到PHP世界,這通常是由糟糕的代碼設計所主導。如果你真的想找一個好的解決方案,你應該實際將你的源碼從PHP移植到Java;)
希望它有幫助。
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
相關問題
- 1. 雙向映射
- 2. 雙向映射
- 3. 雙向映射
- 4. AutoMapper雙向映射
- 5. Python雙向映射
- 6. 雙向/反向映射
- 7. Java中的雙向映射?
- 8. 傑克遜雙向映射
- 9. 雙向映射列表
- 10. 一對多雙向映射
- 11. 雙向多對一映射
- 12. 雙向映射同步
- 13. hibernate @onetomany雙向映射不能正確映射數據
- 14. 角雙向綁定和映射在UI
- 15. Boost :: Bimap相當於雙向多映射
- 16. 代碼的雙向NHibernate映射
- 17. Java中的雙向多值映射
- 18. 總是逆映射雙向關係?
- 19. 映射雙向一對多Hibernate實體
- 20. 雙向映射做對了嗎?
- 21. 休眠註釋雙向映射
- 22. 雙向協會和NHibernate映射
- 23. 休眠一對一映射雙向
- 24. 休眠選擇與雙向映射
- 25. Automapper:使用ReverseMap()和ForMember()雙向映射
- 26. 用休眠映射雙向列表
- 27. 映射和序列化雙向關聯
- 28. 與單向映射和雙向映射混淆在休眠彈簧
- 29. 正向映射vs反向映射
- 30. 以雙射方式將向量映射爲整數
這不會實際實現雙向地圖(沒有額外的檢查)。你可以放入'(1,1)','(1,2)'沒有錯誤。 – dtech