0

G'day

在严格模式下,有没有办法通过值而不是键来搜索地图?

假设我有一张地图:

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

我怎么能通过价值搜索?

4

1 回答 1

1

首先,您示例中的地图不是有效的地图。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 ,则可能构建一个逆映射。

于 2015-07-11T16:40:23.033 回答