こんにちは。今月入社した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関数を用いた方が若干高速なようです。必要に応じて使い分けるのがよさそうですね。