あけましておめでとうございます。
本年もよろしくお願い申し上げます。
以前の記事で、配列に存在しないメンバ名を参照すると、PHPエラーになる旨の記事を書きました。
この時に、配列メンバ名の「あり」「なし」を判断するのにisset()関数を使用しました。
これはこれで、メンバ名のありなし判断ができるのですが、例外がありました。
それは、配列に存在しているメンバ名でも値がNULL(空白)である場合、「存在しない」判定になるというものです。
無論ケースバイケースな事例なので、isset()のままでよいケースもあります。
ただ、確実にメンバ名の有り無しを判断したい場合、isset()では困ります。
そこで、確実に配列のメンバ名ありなしを判断する方法について調べてみました。
isset()でメンバ名なしの判断になってしまう事例
現象は以下のソースで発生します。
配列のメンバ名がそれぞれ「01」「02」「03」となっており、isset()関数で参照しています。
<?php
$table = array("01"=>null, "02"=>0, "03"=>1);
var_dump(isset($table["01"]));
var_dump(isset($table["02"]));
var_dump(isset($table["03"]));
?>
実際に動かすと以下のようになりました。
メンバ名「01」の値はNULLなのですが、メンバ名は存在していますが、結果はfalseが返ってきました。
isset()関数はそもそも実在変数がNULLかを判定する関数
isset()関数は、配列に限らず変数が存在していてかつNULLかどうかを判断する関数です。
だから、メンバ名が存在していても値がNULLだからfalseが返ってきたのです。
もし配列のメンバ名が存在しているかどうかを確認することが目的であった場合は、isset()では誤判定が発生するということになります。
これを回避する方法がないか調べてみました。
PHPには配列のメンバ名有り無しを判断する関数が別途あります。
array_key_exists()関数は、純粋に配列のメンバ名が存在しているかどうかを判定します。
値がNULLでもtrueが返ってきます。
以下のソースで検証してみました。
<?php
$table = array("01"=>null, "02"=>0, "03"=>1);
var_dump(array_key_exists("01", $table));
var_dump(array_key_exists("02", $table));
var_dump(array_key_exists("03", $table));
?>
isset()関数の変わりに「array_key_exists()関数」を使用しています。
見るからにわかりやすい関数名です。
実行した結果がこちらです。
isset()関数ではfalseとなった事例も、trueで返りました。
ちなみに使い方は以下の通りです。
array_key_exists(“メンバ名”, “配列”);
isset()とarray_key_exists()のどちらを使うかはケースバイケース
今回のことを受けて、正確に判定できるならばarray_key_exit()でいいのではないか?
とおもい、array_key_exists()を使っていたら、微妙なケースがありました。
$_REQUEST(PHPのパラメータ受信変数)で値があったら取り出し、値がなかったらデフォルト値を設定するというケースで、array_key_exists()を使ったところ、値がNULLで空であるにも関わらず、値ありの判断となってしまいました。
このケースでは、メンバ名があるかどうかだけでなく、値が存在しているかどうかを判断することも重要な要素です。
nullならばfalseを返すisset()関数のほうが適しています。
メンバ名が存在していても、値がNULLの状態は例外処理に進むことが多いことに気づきました。
array_key_exists()のほうが正確な判定ができますが、isset()の方が実用的と言えます。
目的がメンバ名の有り無し判定なのか、メンバ名の値がNULLかどうかを判定することなのかで使い勝手が異なるということに気づきました。
また一つ良い経験をいたしました。