PHP array_key_exists と isset の違い

配列のキーが存在するかを調べる方法として array_key_exists()isset() があります。似ているようで挙動が異なるため、使い分けを理解しておく必要があります。

array_key_exists()

キーが存在するかだけを調べる。値が null でも true を返す。

isset()

キーが存在し、かつ値が null でないかを調べる。null なら false を返す。

具体的な違い

null が格納されている場合に挙動が分かれます。

$data = [
    'name' => 'Alice',
    'age' => null,
    'active' => false
];

// array_key_exists: キーの存在だけを見る
var_dump(array_key_exists('age', $data));    // true
var_dump(array_key_exists('email', $data));  // false

// isset: キーが存在し、かつ null でないか
var_dump(isset($data['age']));    // false(null だから)
var_dump(isset($data['email']));  // false(キーがない)
var_dump(isset($data['active'])); // true(false は null ではない)

どちらを使うべきか

多くの場面では isset() で十分です。null を明示的に格納する設計でなければ、isset() の方がシンプルで高速です。

$config = [
    'debug' => true,
    'cache' => false
];

// 一般的な用途なら isset で十分
if (isset($config['debug'])) {
    // ...
}

null を「値が設定されていない」という意味で使う場合は、array_key_exists() が必要になります。

$form = [
    'name' => 'Alice',
    'comment' => null  // 未入力を null で表現
];

// comment キーは存在するが値は null
if (array_key_exists('comment', $form)) {
    if ($form['comment'] === null) {
        echo '未入力';
    }
}

Null 合体演算子

PHP 7 以降は Null 合体演算子 ?? を使うことで、存在確認とデフォルト値の設定を 1 行で書けます。内部的には isset() と同じ挙動です。

$config = ['timeout' => 30];

// 従来の書き方
$timeout = isset($config['timeout']) ? $config['timeout'] : 60;

// Null 合体演算子
$timeout = $config['timeout'] ?? 60;

パフォーマンス

isset() は言語構造(構文)なので、関数呼び出しのオーバーヘッドがありません。array_key_exists() は通常の関数です。大量に呼び出す場面では isset() の方が若干高速ですが、実用上の差はほぼありません。