変数が空かどうかを判定する方法について、正しく理解していますか?
PHPには、変数の中身が空であるかを判定するために「empty」と呼ばれる機能が用意されています。しかし、issetとどのように違うのかが分からず、適切に使い分けができているか理解していない人もいるのではないでしょうか?
そこで今回は、
・issetとの違いと使い分け方
について解説します。
目次
emptyの基本
emptyは、PHPが提供する機能で、変数の中身が空であるかを判定します。テキストボックスやラジオボタンなどの入力値があるか否かなど、多くのアプリケーションでは入力値が空であるかを判定する場面が頻繁に出てきます。そのため、プログラム中の変数に対する空チェックは、アプリケーションを開発するうえで最も基本的な要素と言えます。
emptyは、1つの引数を取り、変数であれば何でも引数として渡せます。戻り値は論理値で、変数の中身が空であればTrue、そうでなければFalseを返します。簡単な使い方を、以下のサンプルコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $val = 12; // 引数として、変数を1つ渡せる $result = empty($val); // $resultの中身はTrue、またはFalseが格納されている if ($result) { echo '空です'; } else { echo '空ではありません'; } |
サンプルコードでは、12という値が格納された変数について、emptyを使った空チェックを行っています。戻り値は論理値なので、チェック後にif文やwhile文などと組み合わせるのが、一般的な使い方です。今回は、12という値が格納されており空ではないため、emptyの結果はfalseになります。
emptyの使い方
ここでは、複数の例を挙げて、emptyをどのように使えばよいのか詳しく解説していきます。
文字列の空チェック
emptyの最も一般的な使い方は、変数に文字列が格納されているかをチェックする方法です。PHPの文字列型における空の状態・空でない状態は、以下の通りです。
変数の中身 | 状態であるか否か |
“” | 空である |
NULL | 空である |
“0” | 空である |
“0”以外の1字以上の文字列 | 空ではない |
上記の表で特に注意したいのが「”0″」が格納されている場合です。一見すると文字が格納されているため空ではないように思えますが、PHPのemptyでは「”0″」が格納されている変数は、空であると判定します。
サンプルコードを以下に示します。「””」「NULL」「”0″」以外は、空白文字列や全角の0であっても空ではないという判定になるため、その点は注意しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php $str_array = array( "", // 空文字列:空 NULL, // NULL:空 "0", // 半角の0:空 "1", // 半角の1:空ではない "000", // 1文字以上の半角文字列:空ではない "123", // 1文字以上の半角文字列:空ではない "abc", // 1文字以上の半角文字列:空ではない " ", // 1文字以上のスペース:空ではない "0"); // 全角の0:空ではない foreach ($str_array as $str) { if (empty($str)) { echo $str.":空です<br/>"; } else { echo $str.":空ではありません<br/>"; } } |
もし、変数の中身に何かしら文字が含まれているか否かをチェックしたいのであれば、比較演算子(===)を使ってチェックする方法がおすすめです。サンプルコードは、以下の通りです。
1 2 3 4 5 6 7 8 9 10 |
<?php $str = "0"; // 比較演算子(===)を使って空チェックを行う if ($str === "") { echo $str . ":空です<br/>"; } else { echo $str . ":空ではありません<br/>"; } |
また、空白文字を空として判定させるのであれば、trim関数を併用して以下のように記述するのがおすすめです。
1 2 3 4 5 6 7 8 9 10 |
<?php $str = " "; // trim関数で空白を除去し、比較演算子(===)を使って空チェックを行う if (trim($str) === "") { echo $str . ":空です<br/>"; } else { echo $str . ":空ではありません<br/>"; } |
数値の空チェック
整数や小数などの数値に対しても、emptyを使うことが可能です。数値における空の状態とそうでない状態は、以下の通りです。
変数の中身 | 状態であるか否か |
0、0.0 | 空である |
0以外 | 空ではない |
数値の場合は、0かそれ以外かで区別可能なので、文字列の場合よりも難しくありません。サンプルコードは、以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $str_array = array( 0, // 0:空 0.00, // 0.00:空 1, // 1:空ではない 0.01, // 0.01:空ではない ); foreach ($str_array as $val) { if (empty($val)) { echo $val.":空です<br/>"; } else { echo $val.":空ではありません<br/>"; } } |
論理値の空チェック
論理値の空である状態・そうでない状態は以下の通りです。
変数の中身 | 状態であるか否か |
true | 空ではない |
false | 空である |
特にfalseが格納されている状態は、値が入っているのに空の状態と解釈されるため、注意してください。サンプルコードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $str_array = array( true, // true:空 false, // false:空 ); foreach ($str_array as $bool) { if (empty($bool)) { // var_export関数:boolを文字列出力するために使用 echo var_export($bool, true).":空です<br/>"; } else { // var_export関数:boolを文字列出力するために使用 echo var_export($bool, true).":空ではありません<br/>"; } } |
配列の空チェック
配列の空である状態と空でない状態は、配列の要素数によって以下のように決まります。
配列の要素数 | 状態であるか否か |
0 | 空である |
1以上 | 空ではない |
配列の各要素が空であったとしても、要素数として0でなければ空ではない点に、注意しましょう。サンプルコードは、以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php $array_array = array( 'array1' => array(), // 要素数0:空 'array2' => array(0), // 要素数1:空ではない 'array3' => array(1), // 要素数1:空ではない 'array4' => array(""), // 要素数1:空ではない 'array5' => array(array()), // 要素数1:空ではない ); foreach ($array_array as $key => $array) { if (empty($array)) { echo $key.":空です<br/>"; } else { echo $key.":空ではありません<br/>"; } } |
変数の存在チェック
emptyの特殊な使い方として、変数の存在チェックが挙げられます。はじめに、以下のサンプルコードをご覧ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php // ① if (empty($val)) { echo "空です<br/>"; } else { echo "空ではありません<br/>"; } $val = 10; // ② if (empty($val)) { echo "空です<br/>"; } else { echo "空ではありません<br/>"; } |
①では、未だ定義されていない変数$valを、emptyの引数として渡していますが、定義されていない変数は空である状態と解釈するため、条件式はtrueとなります。次に②に注目すると、直前で$valに10を代入することで$valが定義されたため、条件式はfalseとなります。
issetとの違い
emptyと似ている機能に、issetというものがあります。issetも、変数を引数として渡し論理値を戻り値としています。issetの機能は、変数に値がセットされているかを判定することです。
さまざまな引数に対するissetの戻り値は、以下の通りです。
引数 | 戻り値 |
“” | true |
“0” | true |
0 | true |
配列(要素数0) | true |
配列(要素数1) | true |
論理値 | true |
未定義の変数 | false |
NULL | false |
以下のサンプルコードでは、さまざまな値に対してemptyとissetの挙動を比較しているので、参考にしてみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php $array = array( "val 1" => "", // 空文字列 :セットされている "val 2" => "0", // 文字列の0:セットされている "val 3" => "1", // 文字列の1:セットされている "val 4" => 0, // 数値の0 :セットされている "val 5" => 1, // 数値の1 :セットされている "val 6" => true, // 論理値(true) :セットされている "val 7" => false, // 論理値(false):セットされている "val 8" => array(), // 要素数0の配列:セットされている "val 9" => array(1),// 要素数1の配列:セットされている "val10" => NULL, // NULL:セットされていない "val11" => $val // 変数(未定義):セットされていない ); foreach ($array as $key => $val) { echo $key; echo " isset:"; if (isset($val)) { echo "セットされています "; } else { echo "セットされていません"; } echo " empty:"; if (empty($val)) { echo "空です<br/>"; } else { echo "空ではありません<br/>"; } } |
なお、結果画面の1行目に表示されている警告は、プログラム中で未定義の変数が配列に設定されているのが原因です。
【初心者向け】php「isset」で変数の中身を確認する方法 【PHP入門】わかりやすい!issetの使い方!まとめ
いかがでしたか?
今回は、
・issetとの違いと使い分け方
について解説しました。
emptyは、その名前とは裏腹に、”0″やfalseが設定されている場合も空と解釈する部分に注意する必要があります。emptyを利用する際は、どのような状態を「空である」と解釈するかを、値ごとに整理したうえで、利用するか否かを検討するようにしましょう。