5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PHP】array_keysとarray_flipの速度を比較してみた

Last updated at Posted at 2020-10-17

タイトルの通り、速度検証をしたので、どうやってやったかとその結果を記載します。

忙しい人向け結論

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の検証結果

$result
処理array_keysを1000000回実行 
時間1.633052110672

なるほど、100万回で1.6秒かかるとのことです。

続いて、array_flipの検証結果

$result2
処理array_flipを1000000回実行 
時間2.6483287811279

なんと!こちらは同じ100万回でも2.6秒かかるそうです。

というわけで、結論。

array_flipよりもarray_keysのほうが速い

以上です。ありがとうございました。
何かアドバイス等あればコメントいただけると嬉しいです。

  1. 配列のキーに特定の文字列があるかどうかのチェック方法については、今回やろうとしているin_arrayの第二引数にarray_keysやarray_flipを使うやり方よりも、issetarray_key_existsを使った方がわかりやく、$arrayの要素数によってはパフォーマンスもこちらの方がいいとご指摘をいただきました。そのため、本記事では速度比較をした例、という見方をしていただけますと幸いです。

5
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?