空文字を null に変換するってどういうこと?
PHP で文字列を扱うときに出てくる代表的な2つの状態が「空文字 ""」と「null」です。
前回は「null を空文字に変換」でしたが、今回は逆方向――「空文字を null に変換」する話です。
- 空文字
"":文字列としては存在しているが、中身が何もない状態 null:そもそも「値がない」という状態
実務では、「空文字のまま扱いたい場面」と「空文字は全部 null にそろえたい場面」の両方が出てきます。
ここでは「空文字を null に変換する」ことにフォーカスして、なぜそれが必要になるのか、どう書けばよいのかを丁寧に見ていきます。
なぜ空文字を null に変換したくなるのか
データベース設計とそろえたいとき
たとえば、ユーザーの「ニックネーム」を保存するカラムが NULL を許可しているとします。
このとき、アプリ側のルールとして
「ニックネームが未入力なら、DB には
NULLを入れる」
と決めたいことがあります。
しかし、フォームから送られてくる値はたいてい「未入力=空文字 ""」です。
// フォームから来た値(未入力の場合)
$nickname = $_POST['nickname']; // ""
PHPこのまま DB に保存すると、「未入力なのに "" が入っているレコード」と「NULL が入っているレコード」が混在してしまうことがあります。
そうなると、検索条件を書くときにややこしくなります。
-- どっちも「ニックネームなし」なのに、条件が増える
WHERE nickname IS NULL OR nickname = ''
PHPこれを避けるために、
「アプリ側で空文字を
nullに変換してから保存する」
という方針を取ることがよくあります。
「値がない」と「空である」をはっきり分けたいとき
業務システムでは、「本当に未入力なのか」「あえて空にしているのか」を区別したいことがあります。
null:そもそも値が設定されていない(まだ入力されていない、取得できていない)"":入力した結果、空になっている(意図的に消した、など)
しかし、フォームや外部システムから来る値は、たいてい「未入力=空文字」です。
そこで、「アプリの内部では null を『未設定』の意味として使いたい」という場合、空文字を null に変換しておくと扱いやすくなります。
PHP で空文字を null に変換する基本パターン
パターン1:if 文で素直に書く
一番わかりやすい書き方からいきましょう。
$value = ""; // ここでは空文字が入っているとする
if ($value === "") {
$value = null;
}
var_dump($value); // NULL
PHPここでのポイントは、=== "" で「厳密に空文字かどうか」をチェックしていることです。== "" と書いてしまうと、0 や "0" なども「空っぽっぽい」と判断されてしまう可能性があるので、初心者のうちは必ず === "" を使うのがおすすめです。
パターン2:三項演算子で1行にまとめる
同じことを、三項演算子でコンパクトに書くこともできます。
$value = "";
$value = ($value === "") ? null : $value;
var_dump($value); // NULL
PHP意味としてはこうです。
「もし
$valueが空文字ならnull、そうでなければ元の$valueのまま」
この書き方は、代入と変換を同時に行いたいときに便利です。
パターン3:関数にして再利用しやすくする
同じ「空文字を null に変換する」処理をあちこちで書くなら、関数にしてしまうとコードが読みやすくなります。
function emptyStringToNull($value) {
if ($value === "") {
return null;
}
return $value;
}
$nickname = "";
$nickname = emptyStringToNull($nickname);
var_dump($nickname); // NULL
PHPこの関数名を見ただけで、
「ああ、ここで空文字を
nullにそろえているんだな」
とすぐに分かるので、チーム開発でも意図が伝わりやすくなります。
実務でよくあるシチュエーション別の例題
例題1:フォーム入力を DB に保存する前に変換する
ユーザー登録フォームをイメージしてみましょう。
ニックネームは任意入力で、未入力なら DB には NULL を入れたいケースです。
// フォームから来た値(未入力なら "")
$name = $_POST['name'] ?? "";
$nickname = $_POST['nickname'] ?? "";
// 空文字を null に変換
if ($nickname === "") {
$nickname = null;
}
// ここから先は、$nickname が null または文字列のどちらか
// 例:PDO を使って INSERT するイメージ
$sql = "INSERT INTO users (name, nickname) VALUES (:name, :nickname)";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
// nickname は null の可能性がある
if ($nickname === null) {
$stmt->bindValue(':nickname', null, PDO::PARAM_NULL);
} else {
$stmt->bindValue(':nickname', $nickname, PDO::PARAM_STR);
}
$stmt->execute();
PHPここでの重要ポイントは、
- フォームから来る値は「未入力=空文字」であることが多い
- DB の設計としては「未入力=NULL」にしたいことがある
- そのギャップを埋めるために「空文字を
nullに変換する」
という流れを意識することです。
例題2:外部 API のレスポンスをアプリ内部のルールに合わせる
外部 API からこんなレスポンスが返ってくるとします。
$response = [
'id' => 1,
'name' => '山田太郎',
'email' => '',
'tel' => '',
];
PHPこの API では「未登録の項目は空文字」という仕様だとします。
一方、あなたのアプリでは「未登録は null にしたい」というルールにしたい場合、変換処理を挟みます。
function emptyStringToNull($value) {
return $value === "" ? null : $value;
}
$user = [
'id' => $response['id'],
'name' => $response['name'],
'email' => emptyStringToNull($response['email']),
'tel' => emptyStringToNull($response['tel']),
];
var_dump($user);
PHP結果はこうなります。
array(4) {
["id"]=>
int(1)
["name"]=>
string(12) "山田太郎"
["email"]=>
NULL
["tel"]=>
NULL
}
これで、アプリ内部では「未登録=null」という前提でロジックを書けるようになります。
例題3:配列の全要素に一括で適用する
たくさんの項目をまとめて変換したいときは、array_map を使うと便利です。
$data = [
'name' => '山田太郎',
'nickname' => '',
'email' => '',
'comment' => 'よろしくお願いします',
];
function emptyStringToNull($value) {
return $value === "" ? null : $value;
}
$data = array_map('emptyStringToNull', $data);
var_dump($data);
PHP実行結果は次のようになります。
array(4) {
["name"]=>
string(12) "山田太郎"
["nickname"]=>
NULL
["email"]=>
NULL
["comment"]=>
string(27) "よろしくお願いします"
}
このように、「この配列の中では空文字は存在せず、未入力は必ず null」という状態にそろえられます。
実務では、API やフォームの入力結果を「アプリ内部の標準形式」に変換するときによく使うパターンです。
重要ポイントの深掘り
空文字と null を「なんとなく」で扱わない
初心者がハマりやすいのは、
「空文字と
null、どっちでも動くから気にしない」
という状態です。
短いスクリプトならそれでも動きますが、業務システムでは
- 検索条件
- バリデーション
- 集計処理
- 他システムとの連携
などで、「空文字」と「null」の違いがじわじわ効いてきます。
たとえば、次のような比較を見てください。
var_dump("" == null); // bool(true)
var_dump("" === null); // bool(false)
PHP== だと「同じようなもの」として扱われてしまいますが、=== だと「別物」として扱われます。
実務では、意図しないバグを避けるために、基本的には === を使うことが多いです。
そのうえで、
「アプリ内部では、未入力は
nullにそろえる」
「画面表示や外部出力のときに、必要ならnullを空文字に変換する」
といった「自分たちのルール」を決めておくと、コードが安定します。
どのタイミングで空文字を null に変換するか
これも実務ではとても大事なポイントです。
よくある考え方としては、次のようなパターンがあります。
入力直後で変換するパターン
- フォーム、API、CSV など「外から入ってきた瞬間」に変換する
- 以降の処理では「未入力=
null」として扱える
$input = $_POST['nickname'] ?? "";
$nickname = ($input === "") ? null : $input;
PHP保存前に変換するパターン
- アプリ内部では空文字のまま扱う
- DB に保存するときだけ「空文字→
null」に変換する
$nicknameForDb = ($nickname === "") ? null : $nickname;
PHPどちらが正解というわけではなく、「チームとしてどこでそろえるか」を決めておくことが大事です。
初心者のうちは、
「DB に保存するときに、空文字を
nullに変換する」
というパターンから始めると理解しやすいと思います。
まとめ:今日から使える「空文字を null に変換」テンプレ
最後に、実務でもそのまま使える形で、よく使う書き方をまとめておきます。
単体の値に対して
// $value が空文字なら null にする
$value = ($value === "") ? null : $value;
PHP関数として共通化
function emptyStringToNull($value) {
return $value === "" ? null : $value;
}
$value = emptyStringToNull($value);
PHP配列全体に適用
function emptyStringToNull($value) {
return $value === "" ? null : $value;
}
$data = array_map('emptyStringToNull', $data);
PHP