【PHP】emptyで空かどうか確認する方法|0や”0″の落とし穴とisset・””の使い分け

【PHP】emptyを使用して変数や配列が空かどうか確認する方法 PHP

PHPの empty() は「変数が空かどうか」を判定する関数です。便利ですが、0"0"false も「空」とみなすため、使いどころを誤るとバグになります。この記事では基本に加え、issetや === "" との使い分けを解説します。

この記事の結論:empty($var)falsyな値すべて(空文字・0"0"null[]false)で true を返します。「0」を有効な値として扱いたい場合は empty では弾けないため、isset()=== "" と使い分けます。
スポンサーリンク

empty()の基本

変数・配列が空か
<?php
$var = "";
var_dump(empty($var));   // true(空文字)

$array = [];
var_dump(empty($array)); // true(空配列)

$name = "John";
var_dump(empty($name));  // false

便利な特徴:未定義でも警告が出ない

empty()未定義の変数や配列キーに対しても警告を出さずtrue を返します。そのため $_POST などのあるか分からない値のチェックに便利です。

未定義でも安全
<?php
// $_POST["name"] が送られてこなくても警告なし
if (empty($_POST["name"])) {
    echo "名前が未入力です";
}
これは empty() が内部的に「未設定 または falsy」を判定するためです。一方、未定義変数を $x == "" のように直接比較するとUndefined variable の警告が出ます。

要注意:0や”0″も「空」とみなされる

最大の落とし穴がこれです。empty() は次の値をすべて「空」と判定します。

  • ""(空文字)、"0"(文字列のゼロ)
  • 00.0(数値のゼロ)
  • nullfalse
  • [](空配列)
0 が空扱いになる
<?php
$quantity = 0; // 「数量0」という有効な値のつもり

if (empty($quantity)) {
    echo "未入力です"; // ← 0 なのに「空」と判定されてしまう!
}
「0」や「0という入力」を有効な値として扱いたいときに empty() を使ってはいけません。数量・個数・点数など 0 が意味を持つ場面では、empty()0 を「空」と誤判定します。次の isset()=== "" を使い分けてください。

empty・isset・=== “” の使い分け

判定したいこと 方法
falsyな値すべて(空文字・0・null等)を弾く empty($x)
変数が設定済みでnullでないか isset($x)
「空文字だけ」を弾く(0は許可) $x === ""
未入力か(0は有効値) !isset($x) || $x === ""
0を許可しつつ未入力を弾く
<?php
$value = $_POST["quantity"] ?? "";

// 「0」は有効、空文字だけ弾きたい
if ($value === "") {
    echo "数量を入力してください";
} else {
    $quantity = (int) $value; // 0 もOK
}
NULLかどうかだけを厳密に見るなら === null。判定の使い分け全般はNULL判定の方法、条件分岐はif文による条件分岐を参照してください。

よくある質問(FAQ)

Qempty()は未定義変数でエラーになりますか?
Aなりません。empty()未定義の変数やキーでも警告を出さず true を返します。$_POST など、あるか分からない値のチェックに便利です。
Q0や”0″が「空」と判定されて困ります。
Aempty()falsyな値すべて(0・”0″・false等)を空とみなすためです。0を有効値として扱いたいなら empty は使わず、isset()=== "" で判定してください。
Qemptyとissetの違いは?
Aisset() は「設定済みでnullでない」か、empty() は「未設定 または falsy」かを判定します。$x = 0 のとき、issettrueemptytrue と結果が分かれます。
Q空文字だけを弾きたいです(0は許可)。
A$x === "" を使います。empty() だと0も弾いてしまうため、空文字だけを判定したい場合は厳密比較が適しています。

まとめ

PHPのemptyのポイントを整理します。

  • empty()falsyな値すべて(空文字・0・”0″・null・[]・false)で true
  • 未定義でも警告なし$_POST のチェックに便利
  • 0を有効値にしたい場面では使わない(0も空扱いになる)
  • 「設定済みか」は isset()、「空文字だけ」は === ""

関連として、NULL判定の方法Undefined variable の解決方法if文による条件分岐もあわせて読むと、PHPの判定処理に強くなれます。