PHP双向地图

时间:2013-04-03 18:12:28

标签: php map bidirectional

我正在向PHP移植一段使用大量双向映射(Guava's BiMap)的Java代码。类似Java的映射由PHP数组或SplObjectStorage提供,但是有可用的PHP双向映射库吗?

2 个答案:

答案 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;)

希望它有所帮助。