PHP 配列からユニークな値を取り出す
array_unique() は配列から重複する値を取り除き、ユニークな値だけを残す関数です。最初に出現した要素が残り、後から出現した重複は削除されます。
$values = ['apple', 'banana', 'apple', 'orange', 'banana'];
$unique = array_unique($values);
print_r($unique);
// [0 => 'apple', 1 => 'banana', 3 => 'orange']キーは元のまま保持されるため、インデックスが飛びます。連番にしたい場合は array_values() と組み合わせます。
$unique = array_values(array_unique($values));
// [0 => 'apple', 1 => 'banana', 2 => 'orange']比較フラグ
第 2 引数でソート時の比較方法を指定できます。デフォルトでは文字列として比較されます。
$numbers = ['10', 10, '10.0'];
// デフォルト(文字列として比較)
$unique = array_unique($numbers, SORT_STRING);
// ['10', 10]('10' と 10 と '10.0' は別)
// 数値として比較
$unique = array_unique($numbers, SORT_NUMERIC);
// ['10'](すべて 10 として扱われる)主なフラグは SORT_STRING、SORT_NUMERIC、SORT_REGULAR です。
連想配列での動作
連想配列でも値を基準に重複を削除します。キーは最初に出現したものが残ります。
$data = [
'a' => 'apple',
'b' => 'banana',
'c' => 'apple',
'd' => 'orange'
];
$unique = array_unique($data);
// ['a' => 'apple', 'b' => 'banana', 'd' => 'orange']多次元配列の重複削除
array_unique() は一次元配列でのみ正しく動作します。多次元配列で重複を削除するには、別の方法が必要です。
$users = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 1, 'name' => 'Alice']
];
// シリアライズして比較
$unique = array_map(
'unserialize',
array_unique(array_map('serialize', $users))
);
// または特定のキーで重複を削除
$unique = [];
$ids = [];
foreach ($users as $user) {
if (!in_array($user['id'], $ids, true)) {
$ids[] = $user['id'];
$unique[] = $user;
}
}パフォーマンス
array_unique() は内部でソートを行うため、大きな配列では遅くなります。パフォーマンスが重要な場面では、配列をキーに変換して isset() でチェックする方法が高速です。
// 遅い
$unique = array_unique($largeArray);
// 速い
$seen = [];
$unique = [];
foreach ($largeArray as $value) {
if (!isset($seen[$value])) {
$seen[$value] = true;
$unique[] = $value;
}
}