配列が空の時、配列でキーが指定されていない時、変数がnullの時、0の時、空文字の時…etcどの判定方法を使うべきか毎回迷います。その度に下記の記事のお世話になっているのですが、どうせなら自分でも試してみたいと思ったのでまとめてみました。
前提
- php 8.1
- 利用する関数
- empty()
- isset
- is_null()
ざっくり概要
- empty() いわゆるFalsyな値は、trueになる。ゆるい。
- isset()
is_null()
の逆概念。複数の変数を同時にチェックできる。empty()と同じくエラーが出づらい。 - is_null() 唯一の関数。nullだけチェックしたい時。
結果一覧
値 | empty() | isset() | is_null() |
---|---|---|---|
null | true | false | true |
空文字(”) | true | true | false |
数字(int)のゼロ(0) | true | true | false |
文字(string)のゼロ(‘0’) | true | true | false |
空配列([]) | true | true | false |
真偽値(false) | true | true | false |
未定義の変数 | 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()
変数が宣言されていること、そして
公式ドキュメント issetよりhttps://www.php.net/manual/ja/function.isset.phpnull
とは異なることを検査する
- empty()と同じく関数ではなく、言語構造。
- 複数の引数を渡すことができる。
isset($hoge, $hogehoge)
とかできる。 - 変数しか引数に入れることができない。
- ※直接nullを入れようとしたらl、
Cannot use isset() on the result of an expression (you can use "null !== expression" instead)
とエラーがでました。代替案まで提示してくれるの親切~!
- ※直接nullを入れようとしたらl、
複数の変数を調べる際に、引数が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回実行 | |
1 | 1.653583 | 2.73875 |
2 | 1.650958 | 2.657583 |
3 | 1.660458 | 2.679708 |
4 | 2.001292 | 2.499833 |
5 | 1.6515 | 2.73425 |
平均(ミリ秒) | 1.7235582 | 2.665499 |
is_null()
変数が
公式ドキュメント is_null()より https://www.php.net/manual/ja/function.is-null.phpnull
かどうか調べる
- これは関数。
- nullといえば、??(はてなが2つ)の「null合体演算子」ですが、こちら2つ以上並べることが可能みたいです。知りませんでした、、(https://www.php.net/manual/ja/migration70.new-features.php)
$test1 = null;
$test2 = null;
$test3 = '3つ目の値';
// 最初にヒットするnullではない値が代入される。
$var = $test1 ?? $test2 ?? $test3 ?? '最後の値';
echo($var); // 「3つ目の値」が出力される。
コメント