PHP: isset と array_key_exists による配列キー存在チェックの違い
PHP の連想配列に特定のキーが存在しているかどうかを調べる場合は、
isset か array_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 でチェックしてハマったからだよ (゜Д゜)!
ていうかさぁ。。。
「配列に Null 値が入ってると返り値が違うので使い分けるのがいい。」
って、自分で書いてるのに、、、なんでハマるかなぁ・・・
ディスカッション
コメント一覧
まだ、コメントがありません