タイトルの通り、速度検証をしたので、どうやってやったかとその結果を記載します。
忙しい人向け結論
array_keysとarray_flipだと、array_keysのほうが速い
本題
経緯
あー特定の文字列が配列のキーに含まれているかチェックしたいなー1
in_arrayだと判定対象はvalueだから違うよなー
そうだ!array_flipでkeyとvalueを逆にすればいいんだ!
array_flipの公式ドキュメント
$array = [
'a' => 'あ',
'i' => 'い',
'u' => 'う',
'e' => 'え',
'o' => 'お',
];
$needle = 'a';
if (in_array($needle, array_flip($array), true)) {
// 処理
}
よしできた!(*‘∀‘)
あれ、そういえばarray_keysでキーの配列を作ることもできたよな、、、?
むしろこっちのほうが一般的では、、、?
array_keysの公式ドキュメント
if (in_array($needle, array_keys($array), true)) {
// 処理
}
こっちでもできた!!!
じゃあ、速度的にはどっちを使ったらいいんだろう?
検証
以下のソースコードで検証しました。
説明は適宜コメントアウトで。
// 実行回数
$count = 1000000;
// 配列から見つけたい文字列
$needle = 'a';
// 検索対象の配列
$array = [
'a' => 'あ',
'i' => 'い',
'u' => 'う',
'e' => 'え',
'o' => 'お',
];
// array_keysの速度検証
$st = microtime(true);
for ($i = 0; $i <= $count; $i++) {
in_array($needle, array_keys($array), true);
}
$end = microtime(true);
$result = '処理:array_keysを' . $count . '回実行' . PHP_EOL;
$result .= '時間:' . ($end - $st) . '秒';
echo $result;
// array_flipの速度検証
$st2 = microtime(true);
for ($i = 0; $i <= $count; $i++) {
in_array($needle, array_flip($array), true);
}
$end2 = microtime(true);
$result2 = '処理:array_flipを' . $count . '回実行' . PHP_EOL;
$result2 .= '時間:' . ($end2 - $st2) . '秒';
echo $result2;
参照した記事はこちら
検証結果
まず、array_keysの検証結果
処理:array_keysを1000000回実行
時間:1.633052110672秒
なるほど、100万回で1.6秒かかるとのことです。
続いて、array_flipの検証結果
処理:array_flipを1000000回実行
時間:2.6483287811279秒
なんと!こちらは同じ100万回でも2.6秒かかるそうです。
というわけで、結論。
array_flipよりもarray_keysのほうが速い
以上です。ありがとうございました。
何かアドバイス等あればコメントいただけると嬉しいです。
-
配列のキーに特定の文字列があるかどうかのチェック方法については、今回やろうとしている
in_arrayの第二引数にarray_keysやarray_flipを使うやり方
よりも、isset
やarray_key_exists
を使った方がわかりやく、$array
の要素数によってはパフォーマンスもこちらの方がいいとご指摘をいただきました。そのため、本記事では速度比較をした例、という見方をしていただけますと幸いです。 ↩