あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

PHP - isset と is_null と empty の違い - selectの値の切り分けってどーすんの?

最近、めっきり「ぴちらー(PHPらー)」なあずきです。

いろんな落とし穴にはまってます。
なにかと便利な変数のチェック関数ですが、ちょいちょい挙動が違って悩みます。。。

んで、今回はタイトルのとおり、
「isset と is_null と empty の違いについて 」です。

早速ですが、こんなコードを書いてみました。

<?php

$params[] = array('pattern_name' => '空文字', 'val' => '');
$params[] = array('pattern_name' => '数字の0', 'val' => 0);
$params[] = array('pattern_name' => '文字列の0', 'val' => '0');
$params[] = array('pattern_name' => 'null', 'val' => null);
$params[] = array('pattern_name' => '空の配列', 'val' => array());


foreach($params as $p){
    echo $p['pattern_name'].'の場合<br>';
    echo '! -> '.var_export(!$p['val'], true).'<br>';
    echo 'isset   -> '.var_export(isset($p['val']),true).'<br>';
    echo 'is_null -> '.var_export(is_null($p['val']),true).'<br>';
    echo 'empty   -> '.var_export(empty($p['val']),true).'<br>';
    echo '<br>';
}

気になっていたのは空文字と0の違い。

結果はこんな感じです。

空文字の場合
! -> true
isset -> true
is_null -> false
empty -> true

数字の0の場合
! -> true
isset -> true
is_null -> false
empty -> true

文字列の0の場合
! -> true
isset -> true
is_null -> false
empty -> true

nullの場合
! -> true
isset -> false
is_null -> true
empty -> true

空の配列の場合
! -> true
isset -> true
is_null -> false
empty -> true

わかったことは

  • null以外、挙動は変わらない

ってことでしょうか。。。

参考にさせていただいたサイトによると、

特に気をつけておいた方がいい点

・null値を持つ変数に isset() 関数を適用すると、false が返る。
・否定の ! と empty() 関数の挙動は同一である。! は empty() のエイリアス

なお、明確に「空の配列」を判定したい時は以下のようにすべき。

is_array($arr) && empty($arr)
empty($arr) だけの判定だと、$arr に 空文字が入っていた場合でも true になってしまうので。

とのことです。ふむふむ。



ここで、なんではまってたか、というと、下みたいな感じのselectボックスから値を取って来て、ごにょごにょしたかったのです。

<input type="hidden" name="data[test][select0]" value="" id="testSelect0_"/>
<select name="data[test][select0][]"  id="testSelect0">
<option value="">選択してください</option>
<option value="0">ほげ</option>
<option value="1">ほげほげ</option>
</select>

何も選択していない状態の「""(空文字)」と、ひとつのめの「ほげ」を選択した場合の「0」を切り分けたかったのです。

結論から言うと、結局、「isset」でも「is_null」でも「empty」でも、切り分けることはできませんでした。
だって、どの関数を使ったところで「空文字」と「0」は結局同じ結果だから。

結果、こうなりました。

$select = $data['test']['select'. $i][0];
switch ($select) {
 case '':   
   // 選択されていない場合 
   break;   
 case 0:
   // ほげの場合
   break;
  case 1:     
   // ほげほげの場合
   break;
  default:
   break;
 }

switch文です。。。
もっと他にいいやり方があるかもしれないけど。
こんな初歩的なことで申し訳ないけど。。。


んで、どーでもいいついでに。

PHPのswitch文はcaseになんでも設定できるから使いやすいよね。
特に文字列でもOKな感じがなんとも素敵。

javaだとcaseに設定できるのが、たしか定数とか列挙型のみとかだったような。
めんどくさいからあんまり使ってなかったのです。

PHPに慣れるとjavaに戻るのが大変そうですw

<参考>
programming:php:etc [Tipsというかメモ]