unoh.github.com

配列要素の存在チェック

2007-01-16 10:32:48 +0000

こんにちは。今月入社したyamaokaです。よろしくお願いいたします。

さて、PHPで配列要素の存在チェックを行う場合、どうされていますか? 2通りの書き方があると思いますが、実は動作が異なる場合があるのです。


if (isset($array['foo'])) {   // (1)
    // 存在する
}
if (array_key_exists('foo', $array)) {   // (2)
    // 存在する
}

(1)の場合、要素の値がnullだと存在しないものとして扱われてしまいます。(2)では、該当するキーが存在しさえすれば存在するものとして扱われます。

配列の要素がnullになる可能性がある場合、array_key_exists関数を用いてチェックを行う必要があります。isset関数が使用できるのは、要素の値がnullにならないとわかっている場合だけです。

実行速度はどうでしょうか。PEAR::Benchmarkを利用して計測してみます(計測した環境はWindows XP、PHP 4.4.4です)。


// PEAR::Benchmark
require_once 'Benchmark/Iterate.php';

$benchmark = new Benchmark_Iterate();
$array = array('foo' => 'foo', 'bar' => 'bar');

$benchmark->run(100, 'isset_test', array('foo', $array));
$result = $benchmark->get();
echo 'isset            : ', $result['mean'], "\n";

$benchmark->run(100, 'array_key_exists_test', array('foo', $array));
$result = $benchmark->get();
echo 'array_key_exists : ', $result['mean'], "\n";

function isset_test($key, $array)
{
    return isset($array[$key]);
}

function array_key_exists_test($key, $array)
{
    return array_key_exists($key, $array);
}

5回計測を行った結果は以下のようになります。

1回目
    isset            : 0.000363
    array_key_exists : 0.000418
2回目
    isset            : 0.000388
    array_key_exists : 0.000431
3回目
    isset            : 0.000411
    array_key_exists : 0.000445
4回目
    isset            : 0.000398
    array_key_exists : 0.000425
5回目
    isset            : 0.000396
    array_key_exists : 0.000420

isset関数を用いた方が若干高速なようです。必要に応じて使い分けるのがよさそうですね。