2015-07-11 57 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