誕生日
厳密モードで、キーではなく値でマップを検索する方法はありますか?
マップがあるとします:
$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 を使用します。