🛠️

PHPの配列から重複を削除するにはarray_unique()よりarray_keys(array_flip())が速いのか

2024/04/10に公開

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