🐘
PHPで重複のない値を取得して配列とする時に迷う手法
問い
重複のない値を取得したい。
例えば、 [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