issetとarray_key_existsの違いはnull値で分かれる

issetとarray_key_existsは、どちらもキーの存在を調べる関数ですが、issetは値がnullのキーを偽とみなす点で分かれます。null値をどう扱うかで使い分ける関数ですね。

キーはあるのにissetが偽を返す

issetと array_key_exists、どちらもキーの存在を調べる関数のように見えますが、値が null のキーでばっさり挙動が分かれます。isset は「キーがあって、かつ値が null でない」ときにだけ true を返すんですね。

$data = ['name' => '田中', 'nickname' => null];

isset($data['nickname']);            // false(値がnull)
array_key_exists('nickname', $data); // true(キーは存在する)

「キーが存在するか」を厳密に知りたいのに isset を使ってしまうと、null が入っているだけのキーを「無い」と誤判定します。フォームの項目が送られてきたかどうかを見るような場面で、地味にハマるポイントですね。

用途で使い分ける

実務では「値が使える状態か(null でも空でもないか)」を知りたいことが多いので、isset の出番が圧倒的に多いです。一方、null を意味のある値として区別したい設定配列などでは array_key_exists が要ります。

// 設定でキー未指定とnull明示を区別したい
if (array_key_exists('timeout', $config)) {
    // 明示的にnullを渡してデフォルト無効化、なども表現できる
    $timeout = $config['timeout'];
}

??演算子はissetと同じ判定

PHP7 の null 合体演算子 ?? も、内部的には isset と同じ判定です。つまりキーが無いときと値が null のとき、両方で右辺が採用されます。この挙動を理解していないと、null を保持したいのに黙ってデフォルトに差し替えられてしまいます。

$data = ['x' => null];
echo $data['x'] ?? 'デフォルト'; // 'デフォルト'(nullなので右辺)
// nullをnullとして受けたいなら
$x = array_key_exists('x', $data) ? $data['x'] : 'デフォルト';

まとめ

両者の分かれ目は「値が null のキーをどう扱うか」の一点です。値が実質的に使えるかを見たいなら isset や ??、キーの物理的な存在を厳密に見たいなら array_key_exists、と覚えておけば迷いません。null を意味のある値として使う設計のときだけ、この違いが牙をむくという気がします。

よくある質問

Q. issetとarray_key_existsの違いは何ですか。
A. issetは値がnullのキーを偽とみなし、array_key_existsはキーが存在すれば真を返します。null値のキーで挙動が分かれます。

Q. ??演算子はどちらの判定に近いですか。
A. issetと同じ判定です。キーが無いときも値がnullのときも右辺が採用されるので、nullを保持したい場面には向きません。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です