PHP

PHPでJSONから取り出した値が空かどうか判断する方法

string

さてさてこんにちは!
それでは本日もブログを更新していきましょう!

今回もPHPのお話です。

issetだと空文字の時もTrueになってしまう

JSON文字列から特定のキーに紐づく値を取り出して使う時ってありますよね?

例えば、”drink”というキーに”tea”という値が入っていた時に○○する、”water”の時は△△する、何も値が入っていなかった時はエラーを出すみたいな感じです。

で、有効な文字列が入っている時と、NULLまたは空文字の時を区別して処理したい時にどうするか、というお話です。

最初はissetを使っていました。
以下のような感じです。

$body = $request->getContent(); // JSONをパース 
$jsonObj = json_decode($body); 
if (empty($jsonObj)) {
 //エラー処理 
} 
if(isset($jsonObj->drink)){
 //drinkが指定されている場合の処理(ドリンクの注文処理など) 
}else{
 error_log("I do not need drink","3","{ログを出力するディレクトリまでのパス}"); 
}

ただ、これだとJSONの中身が以下の様な時にtrueになってしまいます。

"drink":"" // 空文字

ドリンクを頼んでいないのに注文処理が行われてしまうのです。
お客さんも、頼んでいないのにドリンクが来たら困ってしまいますよね。

調べてみたところ、どうやらissetを使ったのが不適切だった様です。

issetって?

公式のドキュメントによると以下のようです。

isset — 変数がセットされていること、そして NULL でないことを検査する
bool isset ( mixed $var [, mixed $… ] )
変数がセットされており、それが NULL でないことを調べます。

PHP マニュアル 関数リファレンス 変数・データ型関連 変数操作 変数操作 関数

つまり、NULLかどうかを調べるだけなので、空文字が入っていてもTRUEになるということですね。

今回は、NULLまたは空文字の時と、文字列が指定されている時とで処理を分けたいので、issetではうまくいきません。

そこで使うのがemptyです。

emptyとは?

公式ドキュメントには以下のようにあります。

empty — 変数が空であるかどうかを検査する
bool empty ( mixed $var )
変数が空であるかどうかを検査します。 変数が空であるとみなされるのは、変数が存在しない場合や 変数の値が FALSE に等しい場合です。

PHP マニュアル 関数リファレンス 変数・データ型関連 変数操作 変数操作 関数

重要なのは後半部分の「変数が空であるとみなされるのは、変数が存在しない場合や 変数の値が FALSE に等しい場合です。」です。
変数が空とみなされるのは以下の場合だそうです。

次のような値は空であるとみなされます。
“” (空文字列)
0 (整数 の 0)
0.0 (浮動小数点数の 0)
“0” (文字列 の 0)
NULL
FALSE
array() (空の配列)
$var; (変数が宣言されているが、値が設定されていない)

PHP マニュアル 関数リファレンス 変数・データ型関連 変数操作 変数操作 関数

空文字も空とみなされるのです!
勿論、NULLの時も空という扱いになります。

以上より、最初に示したコードを修正すると以下のようになります。
処理はこんな感じ。

$body = $request->getContent(); // JSONをパース 
$jsonObj = json_decode($body); 
if (empty($jsonObj)) {
 //エラー処理 
} 
if(!empty($jsonObj->drink)){
 //drinkが指定されている場合の処理(ドリンクの注文処理など) 
}else{
 error_log("I do not need drink","3","{ログを出力するディレクトリまでのパス}"); 
}

終わりに

今回はPHPのissetとemptyの違いについて取り上げました。
条件式で使用する場合は判定結果がガラッと変わってしまうので、それぞれの特徴をしっかりと理解することが大切ですね。

それでは、本日はここまで。
お読みいただきありがとうございました!