🐘

PHPで重複のない値を取得して配列とする時に迷う手法

2025/02/10に公開

問い

重複のない値を取得したい。

例えば、 [1, 1, 2, 2, 3, 3, 3, 3, 4] という配列から [1, 2, 3, 4] としたい。

この場合は単純に array_unique が使える。

少し処理が入る場合、

$result = [];
foreach ($list as $v) {
    // 何か処理がある
    $result[$v] = null;
}
var_dump($result); // 重複のない値がkeyに入る

とするのか、

$result = [];
foreach ($list as $v) {
    // 何か処理がある
    $result[] = $v;
}
$result = array_unique($result);
var_dump($result); // 重複のない値がvalueに入る

とするのか、どちらがいいのか?

メリット・デメリット

1つ目のアプローチ(nullを使用)

  • キーをインデックスとして直接使用し、値をnullにセット
  • 重複キーは自動的に上書きされる
  • メモリ効率が良い
  • 追加の関数呼び出しが不要

2つ目のアプローチ(array_unique)

  • 配列に全てのキーを追加してから重複を除去
  • array_unique()の実行に追加のCPU処理が必要
  • 一時的に重複データを保持するため、メモリ使用量が多い
  • コードがやや冗長

結論

結論として、 1つ目のアプローチ(nullを使用) をお勧めします。理由は:

  • パフォーマンスが優れている
  • メモリ効率が良い
  • コードがシンプル
  • PHPの連想配列の特性を活かしている

ただし、以下の場合は2つ目のアプローチが適している可能性があります:

  • 重複を含む元の配列を保持する必要がある場合
  • キーの出現順序を維持する必要がある場合

Discussion