The answers so far are spot-on. Using isset
in this case is faster because
- It uses an O(1) hash search on the key whereas
in_array
must check every value until it finds a match. - Being an opcode, it has less overhead than calling the
in_array
built-in function.
These can be demonstrated by using an array with values (10,000 in the test below), forcing in_array
to do more searching.
isset: 0.009623
in_array: 1.738441
This builds on Jason’s benchmark by filling in some random values and occasionally finding a value that exists in the array. All random, so beware that times will fluctuate.
$a = array();
for ($i = 0; $i < 10000; ++$i) {
$v = rand(1, 1000000);
$a[$v] = $v;
}
echo "Size: ", count($a), PHP_EOL;
$start = microtime( true );
for ($i = 0; $i < 10000; ++$i) {
isset($a[rand(1, 1000000)]);
}
$total_time = microtime( true ) - $start;
echo "Total time: ", number_format($total_time, 6), PHP_EOL;
$start = microtime( true );
for ($i = 0; $i < 10000; ++$i) {
in_array(rand(1, 1000000), $a);
}
$total_time = microtime( true ) - $start;
echo "Total time: ", number_format($total_time, 6), PHP_EOL;