2015-07-11 141 views
0

G'dayHackark - 按值搜索地图

在严格模式下,有没有一种方法可以通过值而不是键搜索Map?

说我有一个地图:

$temp = Map{'melon', 'apple'}; 

我怎么可能通过值搜索?

回答

1

首先,您示例中的地图不是有效的地图。 Hack中的地图是键值对,您只能提供密钥。我想这是一个错字,你打算给的例子是像

$temp = Map {'fruit' => 'apple', 'veg' => 'carrot'}; 

要搜索在哈克的地图,你可以做你的PHP将同样的事情:叠代在为O(n )扫描。下面是一个示例函数,它使用Hack泛型编写,因此无论输入Map如何,它都将具有正确的类型。

function find_key<Tk, Tv>(Map<Tk, Tv> $haystack, Tv $needle): ?Tk { 
    foreach ($haystack as $k => $v) { 
    if ($v === $needle) { 
     return $k; 
    } 
    } 
    return null; 
} 

但是,最后一个问题回到你身上:你为什么要搜索这样的地图?地图意味着对给定键快速查找值,以及对所有键/值对进行快速迭代。他们是而不是这样设计的值查找 - 这就是为什么它需要一个O(n)循环,它应该引发警告信号,表明你所做的可能不是最好的。您可能需要考虑使用更合适的数据结构:如果您经常执行此操作,或者使用集合或矢量,则可能会构建反向映射。

+0

我正在阅读文档,他们说尽可能使用地图。我不知道Google地图需要键值对。我认为他们会添加一个元素到对象的末尾,类似于PHP中数组的工作方式。第二个问题是为什么。我有多个数组,旨在通过值进行搜索,如果这些数组中有一个存在,则它的意思是返回一个常量。 我想也许地图有一个像“包含”的功能,但搜索的价值不是关键。 – Tim

+1

地图非常故意不像PHP数组那样行事,为了避免混淆语义在PHP数组中的含义 - “array_merge”的行为体现了这种复杂性。这就是为什么有'Vector'和'Set',这取决于*为什么*您的地图是“旨在按价值搜索”可能是一个更好的替代品。按价值搜索地图几乎不是一个好主意,也是坏设计的指示。你能把我链接到说的总是使用地图的文档页面,我们应该修正/澄清它。 –

+0

我误读了这些信息,http://docs.hhvm.com/manual/en/hack.arrays.php - 说:Hack语言指导是随时随地使用集合。道歉。我采取了背景说的话。我将使用“Sets”,因为它们似乎是我想要使用的。 – Tim