G'day
在严格模式下,有没有办法通过值而不是键来搜索地图?
假设我有一张地图:
$temp = Map{'melon', 'apple'};
我怎么能通过价值搜索?
首先,您示例中的地图不是有效的地图。Hack 中的映射是键值对,你只提供键。我认为这是一个错字,您要给出的示例类似于
$temp = Map {'fruit' => 'apple', 'veg' => 'carrot'};
要在 Hack 中搜索地图,您可以执行与 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) 循环,这应该引发警告信号,表明你正在做的事情可能不是最好的。您可能需要考虑使用更合适的数据结构:如果您经常执行此操作,或者使用 Set 或 Vector ,则可能构建一个逆映射。