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_STRINGSORT_NUMERICSORT_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;
    }
}