我向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