PHP: isset と array_key_exists による配列キー存在チェックの違い

array_key_exists

PHP の連想配列に特定のキーが存在しているかどうかを調べる場合は、
issetarray_key_exists を使う。

以前、「PHP 高速化に関するメモ書き」という記事でも書いた通り、

isset は言語構造であり、array_key_exists は関数なので、関数呼び出しのオーバーヘッドがある分、array_key_exists の方が遅い。

でも、実際に計測すると 10万件くらいのデータで検索しても、性能が良いサーバーなら全く差は無いし、性能の悪いサーバーでもマイクロ秒単位程度の差しか出ない。

少なくともミリ秒単位での差は出ない

まぁ isset の方が速いのは間違いないんだけどね。

だが、「確実性」を求めるなら、array_key_exists の方が確実である。

なぜなら、isset は「未定義変数 且つ NULL」の場合に FALSE を返すからだ。

つまり、

$arr = array(
	'red'    => 'aka',
	'blue'   => 12345,
	'yellow' => true,
	'green'  => false,
	'white'  => '',
	'black'  => null
);

↑ こーいう配列があったとすると

↓ 結果はこーなる

array_key_exists( 'red', $arr )    → true
array_key_exists( 'blue', $arr )   → true
array_key_exists( 'yellow', $arr ) → true
array_key_exists( 'green', $arr )  → true
array_key_exists( 'white', $arr )  → true
array_key_exists( 'black', $arr )  → true
isset( $arr['red'] )    → true
isset( $arr['blue'] )   → true
isset( $arr['yellow'] ) → true
isset( $arr['green'] )  → true
isset( $arr['white'] )  → true
isset( $arr['black'] )  → false

$arr という配列に ‘black’ というキーが存在しても、isset の場合は false になる。

配列内に確実に NULL が無いと分かっているなら、isset で良いが、確実性を求めるなら array_key_exists の方が無難かなぁ。と思う。

なんで、こんな記事を書いてるかって?

NULL の入ってる配列を isset でチェックしてハマったからだよ (゜Д゜)!

ていうかさぁ。。。

「PHP 高速化に関するメモ書き」 で、

「配列に Null 値が入ってると返り値が違うので使い分けるのがいい。」

って、自分で書いてるのに、、、なんでハマるかなぁ・・・

IT・ICT

Posted by るな