🛠️
PHPの配列から重複を削除するにはarray_unique()よりarray_keys(array_flip())が速いのか
PHPにて配列の値から重複を削除するのに、array_unique()より、array_keys(array_flip())の方が速いと噂があったので、実際にどうなのか比較してみました。
<?php
// PHP Version => 8.1.9
$time_start = microtime(true);
$start_memory = memory_get_usage();
$array = [];
// 1000,2000000の回数で比較する
for ($i=0;$i<=2000000;$i++) {
// 0から9の連続した値を重複させる
$array[] = $i % 10;
$array[] = $i % 10;
}
// array_unique() vs array_keys(array_flip())
$result = array_unique($array);
//$result = array_keys(array_flip($array));
echo (memory_get_peak_usage() - $start_memory) / (1024 * 1024)." MB\n";
echo microtime(true) - $time_start." S\n";
echo print_r($result, true);
上記コードでarray_unique() と array_keys(array_flip())で1000回、2000000回でどう違うか試してみます。
array_unique()
# 1000回
0.14555358886719 MB
0.00016021728515625 S
Array
(
[0] => 0
[2] => 1
[4] => 2
[6] => 3
[8] => 4
[10] => 5
[12] => 6
[14] => 7
[16] => 8
[18] => 9
)
# 2000000回
288.00497436523 MB
0.30770993232727 S
Array
(
[0] => 0
[2] => 1
[4] => 2
[6] => 3
[8] => 4
[10] => 5
[12] => 6
[14] => 7
[16] => 8
[18] => 9
)
重複があった場合、最初のキーを使うため、キーは連続しなくなる。
array_keys(array_flip())
# 1000回
0.13358306884766 MB
0.00013399124145508 S
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
[8] => 8
[9] => 9
)
# 2000000回
256.00862884521 MB
0.25886416435242 S
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
[8] => 8
[9] => 9
)
array_flip()でキーと値を入れ替える際に重複を削除して、その後 array_keys()にてキーから配列を作成します。
結論
確かに、array_keys(array_flip())の方がメモリ、処理速度が速かった。
ただ、1000件の場合は、メモリ、処理速度にそこまで差がないため、array_unique()の方が可読性が優れていていいかなと思いました。(キーが0から連番にならないことに注意)
Discussion