シェアする

PHPによる配列キー存在チェックの注意点

PHPで連想配列を使う時、配列にキーが存在しているかどうか
チェックを行う場合があると思います。

そんな時によく使われるのが、 array_key_exists や isset です。
ただし2つとも微妙に挙動が違うので、正しい挙動を覚えておきたいところです。

isset

isset の使い方は以下のような感じです。

$array = array(
    'test1' => 'テスト1だよ'
    , 'test2' => 'テスト2だよ'
    , 'test3' => null
    , 'test4' => 'テスト4だよ'
);

test1 というキーの存在チェックは、

if( isset( $array['test1'] ) ) {
    echo 'ok';
} else {
    echo 'ng';
}

このように記述します。
結果は、 ok となります。

では、キーの値が null の場合はどうでしょうか。

if( isset( $array['test3'] ) ) {
    echo 'ok';
} else {
    echo 'ng';
}

答えは、 ng です。
ok とならないところが肝心です。

このように isset は、キーが存在しても値が null の場合は、
false と判定してしまいます。

array_key_exists

array_key_exists の使い方は以下のような感じです。

$array = array(
    'test1' => 'テスト1だよ'
    , 'test2' => 'テスト2だよ'
    , 'test3' => null
    , 'test4' => 'テスト4だよ'
);

test1 というキーの存在チェックは、

if( array_key_exists( 'test1', $array ) ) {
    echo 'ok';
} else {
    echo 'ng';
}

このように記述します。
結果は、 ok となります。

では、キーの値が null の場合はどうでしょうか。

if( array_key_exists( 'test3', $array ) ) {
    echo 'ok';
} else {
    echo 'ng';
}

答えは、 ok です。
isset の時とは挙動が違いますね。

では、存在しない test5 というキーの場合はどうでしょうか。

if( array_key_exists( 'test5', $array ) ) {
    echo 'ok';
} else {
    echo 'ng';
}

答えは、 ng です。

このように、 array_key_exists の場合は、
キーの値が null でもしっかりキーの存在チェックを行います。

確実にキーが存在するかどうかの場合は、
isset ではなく、 array_key_exists を使う方がいいでしょう。