連想配列(マップ/ハッシュ/ディクショナリ)に特定のキーが含まれているかどうかを判定するには (containsKey / contains / array_key_exists / isset / in / has_key? / key? / include? / member? / exists)

連想配列(マップ/ハッシュ/ディクショナリ)に特定のキーが含まれているかどうかを判定する方法。

Java map.containsKey(key)
Scala map.contains(key)
PHP array_key_exists($key, $arr)
isset($arr[$key]))
Python key in dic
Ruby hash.hash_key?(key)
Perl exists($hash{$key})

関連

Java

Signature:

Scala

Signature:

Javaとはメソッド名が違う。

val map = Map("a" -> 1, "b" -> 2, "c" -> 3);
println(map.contains("a"));
// => true
println(map.contains("A"));
// => false

PHP

array_key_exists関数またはissetを使う。 isset は通常の関数ではなく、PHPの言語構造である。

$arr = array('a' => 1, 'b' => 2);

var_export(array_key_exists('a', $arr)); // => true
var_export(isset($arr['a']));            // => true
var_export(array_key_exists('A', $arr)); // => false
var_export(isset($arr['A']));            // => false

issetは値がNULLの場合に要素が存在していてもFALSEを返してしまう。

$arr = array('a' => 1, 'b' => 2, 'c' => NULL);

if (array_key_exists('c', $arr)) {
  echo "exists\n";
} else {
  echo "not exists\n";
}
// => exists

// NULLと要素が存在しないのとは区別できない
if (isset($arr['c'])) {
  echo "exists\n";
} else {
  echo "not exists or NULL\n";
}
// => not exists or NULL

// 子要素が配列でないのに配列のつもりでアクセスしてもwarning等は発生しない
// isset は関数でなく言語構造だから
if (isset($arr['b']['B'])) {
  echo "exists\n";
} else {
  echo "not exists or NULL\n";
}
// => not exists or NULL

array_key_exists 関数 | PHP Manual
http://php.net/manual/ja/function.array-key-exists.php

isset | PHP Manual
http://php.net/manual/ja/function.isset.php

ところで isset のほうが array_key_exists よりも速いらしい。

PHPの変数チェック速度比較 isset vs array_key_exists vs 直接チェック | k-motoyan888’s diary
http://k-motoyan888.hatenablog.com/entry/2013/07/24/202111

Python

Python3ではin演算子を使う。Python2ではin演算子に加えて、has_keyメソッドも同じように使える。どちらもTrueFalseを返す。

dic = {'a': 1, 'b': 2}

print('a' in dic) # => True
print('x' in dic) # => False

# Python3 ではエラーになる
print(dic.has_key('a')) # => True
print(dic.has_key('x')) # => False

Ruby / JRuby

以下の4つのメソッドはすべて同じ意味。

Hash#has_key?(key)
Hash#key?(key)
Hash#include?(key)
Hash#member?(key)

Perl

if (exists($hash{$key})) {
    ...;
}

レファレンスの場合の例

if (exists($hash_ref->{$key})) {
    ...;
}

defined を使ってしまうと、キーが存在しない場合と、 undef が値として保存されている場合の区別ができなくなってしまう。

JavaScript

in という演算子があるので、これを使う。

var map = {a: 1, b: 2}

console.log('a' in map);
// => true
console.log('c' in map);
// => false
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。