PHPの空の判定方法の整理

配列が空の時、配列でキーが指定されていない時、変数がnullの時、0の時、空文字の時…etcどの判定方法を使うべきか毎回迷います。その度に下記の記事のお世話になっているのですが、どうせなら自分でも試してみたいと思ったのでまとめてみました。

Qiita
PHP isset, empty, is_null の違い早見表 - Qiita PHP isset, empty, is_null の違い早見表引用http://d.hatena.ne.jp/sngmr/20080209/1202520832参考リンクhttp://qi…

前提

  • php 8.1
  • 利用する関数
    • empty()
    • isset
    • is_null()

ざっくり概要

  • empty() いわゆるFalsyな値は、trueになる。ゆるい。
  • isset() is_null()の逆概念。複数の変数を同時にチェックできる。empty()と同じくエラーが出づらい。
  • is_null() 唯一の関数。nullだけチェックしたい時。

結果一覧

empty()isset()is_null()
nulltruefalsetrue
空文字(”)truetruefalse
数字(int)のゼロ(0)truetruefalse
文字(string)のゼロ(‘0’)truetruefalse
空配列([])truetruefalse
真偽値(false)truetruefalse
未定義の変数true (※エラーがでない)false (エラーがでない)エラーが出る
配列の未定義のキーにアクセスtrue (※エラーがでない)
* 多次元配列でも使えた。
false (エラーがでない)
* 多次元配列でも使えた。
エラーが出る

empty()

変数が空であるかどうかを検査する

公式ドキュメント empty()より https://www.php.net/manual/ja/function.empty.php

初めて知ったのですが、empty()は関数ではなくて、言語構造だそうです。「言語構造」という言葉がピンと来ていなかったのでChat GPTにきいたり調べたところ、言語にもとから存在するifやechoと同じような存在らしいです。

あわせて読みたい
PHP: empty - Manual PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.
楽しいだけで十分です
PHPの言語構造とは - 楽しいだけで十分です パーフェクトPHPを写経しながら読んでるのですが、「echo文は言語構造である」の意味がよく分からなかったので調べてみました。 言語構造とは 言語構造(Language Construc...

isset()

変数が宣言されていること、そして null とは異なることを検査する

公式ドキュメント issetよりhttps://www.php.net/manual/ja/function.isset.php
  • empty()と同じく関数ではなく、言語構造。
  • 複数の引数を渡すことができる。isset($hoge, $hogehoge) とかできる。
  • 変数しか引数に入れることができない。
    • ※直接nullを入れようとしたらl、Cannot use isset() on the result of an expression (you can use "null !== expression" instead)とエラーがでました。代替案まで提示してくれるの親切~!

複数の変数を調べる際に、引数が2つisset($hoge, $test)と2回実行isset($hoge) && isset($test) はどちらが実行速度が速いのか気になったので試してみました。

計測

Chat Gptに出してもらったコードをアレンジしました。それぞれ1万回実行にかかる時間を計測してみました。計測コードは下記です。

結果としては、isset()に2つ引数を入れて実行する方が、1ミリ秒ほど速いようです。ただし、1万回実行した結果なので、誤差の範囲内と言っても良さそうです。

// 1. テスト用の配列を用意
$data = [];

$string = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPUQRSTUVWXYZ';

for ($i = 0; $i < 1000; $i++) {
    $data['key' . $i] = str_shuffle($string);
}

$iterations = 10000; // 実行回数
         
// 2. 引数が2個の場合
$start_time = hrtime(true);

for ($i = 0; $i < $iterations; $i++) {
    isset($data["key" . rand(0, 10000)], $data["key" . rand(0, 10000)]);
}

// 実行終了時刻を記録
$end_time = hrtime(true);

// 実行時間を計算して表示 (ナノ秒 → ミリ秒)
$execution_time = $end_time - $start_time;
$time = $execution_time/1000000;

// 2. isset()を2回実行する場合
$start_time_2 = hrtime(true);

for ($i = 0; $i < $iterations; $i++) {
    isset($data["key" . rand(0, 10000)]);
    isset($data["key" . rand(0, 10000)]);
}

// 実行時間を計算して表示 (ナノ秒 → ミリ秒)
$end_time_2 = hrtime(true);
$time_2 = ($end_time_2 - $start_time_2)/1000000;
isset()に2つ引数を入れるisset()が2回実行
11.6535832.73875
21.6509582.657583
31.6604582.679708
42.0012922.499833
51.65152.73425
平均(ミリ秒)1.72355822.665499

is_null()

変数が null かどうか調べる

公式ドキュメント is_null()より https://www.php.net/manual/ja/function.is-null.php
$test1 = null;
$test2 = null;
$test3 = '3つ目の値';

// 最初にヒットするnullではない値が代入される。
$var =  $test1 ?? $test2 ?? $test3 ?? '最後の値'; 
echo($var); // 「3つ目の値」が出力される。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次