【PHP】in_array()での重複チェックと添字直アクセスのスピード比較。

例えばループ処理中重複した値を弾きたい場合、下記2つのアプローチではどちらが高速なのだろうか。

1, キャッシュ配列に値を詰め込みその後、in_array()を用いて重複値をチェックする
2, 値を配列のキーに持たせ、isset()にて添字の存在チェックい重複を弾く

結果は以下のとおり。

$cache = array();
$start = microtime(true);
for($i = 0; $i < 10000; $i++) {
	$md5 = md5($i);
	if(!in_array($md5, $cache)) {
		$cache[] = $md5;
	}
}
$end = microtime(true);

echo $end - $start."\n";


$cache = array();
$start = microtime(true);
for($i = 0; $i < 10000; $i++) {
	$md5 = md5($i);
	if(!isset($cache[$md5])) {
		$cache[$md5] = true;
	}
}
$end = microtime(true);

echo $end - $start."\n";

上はin_array()、下はisset()

5.5056478977203
0.020223140716553

その差は272倍。
圧倒的に添字アクセスの方が速い。