PHP Tips | 文字列処理:基本操作 – 空文字を null に変換

PHP PHP
スポンサーリンク

空文字を 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

タイトルとURLをコピーしました