我正在向PHP移植一段使用大量双向映射(Guava's BiMap)的Java代码。类似Java的映射由PHP数组或SplObjectStorage提供,但是有可用的PHP双向映射库吗?
答案 0 :(得分: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.');
}
答案 1 :(得分:0)
一旦将值放入2个数组中,我就这样做了。如果keySet()和valueSet()是析取的,你甚至可以使用一个值。例如:
$mapKtoV = array();
$mapVtoK = array();
function putInMap ($key,$value)
{
$mapKtoV[$key] = $value;
$mapVtoK[$value] = $key;
}
当然你也可以把它们放到一个班级里。
你是否也认为这个解决方案看起来很狡猾和闻起来?是的,是的,欢迎来到PHP的世界,这通常由糟糕的代码设计主导。如果您真的在寻找一个好的解决方案,那么您实际上应该将源代码从PHP移植到Java;)
希望它有所帮助。