PHPで配列を扱っていると、重複したデータを取り除きたい場面がよくあります。

例えば、ユーザーが選択したタグの一覧や、データベースから取得したカテゴリ名の一覧など、同じ値が複数含まれているケースは珍しくありません。
重複を残したまま処理を進めると、表示が二重になったり、データの集計結果がずれてしまう原因にもなります。

そこで便利なのが、PHPのarray_unique()関数です。
この記事では、PHP初心者でもすぐに使える「配列から重複データを削除する方法」を丁寧に解説していきます。

PHPで配列の重複を削除する方法は?

配列から重複した値を取り除く最もシンプルな方法は、array_unique()関数を使うことです。

基本的な使い方は、このようになります。

<?php
$fruits = ["りんご", "バナナ", "りんご", "みかん", "バナナ"];
$unique = array_unique($fruits);
print_r($unique);
?>

出力結果はこちらです。

Array
(
[0] => りんご
[1] => バナナ
[3] => みかん
)

これだけで、重複した「りんご」や「バナナ」が1つにまとめられます。
array_unique()関数はPHPの組み込み関数なので、特別なライブラリを追加する必要もなく、手軽に利用できます。

なお、出力結果を見るとわかるように、重複が見つかった場合は最初に出現した要素が残り、後から出現した要素が削除されます。
また、元の配列のキー(インデックス)がそのまま保持される点も覚えておきましょう。

詳細は公式マニュアル(PHP: array_unique – Manual)も確認すると安心です。

array_uniqueの詳しい使い方

こちらのセクションでは、array_unique()関数の詳しい使い方を説明していきます。

まず、使用できる引数はこちらです。

第1引数:重複を削除したい配列
第2引数:比較時のソートフラグ(省略可)

第2引数では、値を比較する際の方法を指定できます。
それでは、実際にコードを書きながら説明します。

デフォルトの動作(文字列として比較)

第2引数を省略した場合、デフォルトではSORT_STRINGが適用され、値を文字列として比較します。

<?php
$data = ["100", 100, "100"];
$unique = array_unique($data);
print_r($unique);
// 出力:Array ( [0] => 100 )
?>

文字列の"100"と整数の100が同じものとして扱われ、1つにまとめられます。

ソートフラグを指定する

第2引数にソートフラグを指定すると、比較の方法を変更できます。
主なソートフラグはこちらです。

  • SORT_STRING(デフォルト):文字列として比較
  • SORT_REGULAR:型変換をせずに通常の比較
  • SORT_NUMERIC:数値として比較
  • SORT_LOCALE_STRING:現在のロケールに基づいて文字列比較

例えば、SORT_REGULARを使うと型の違いも区別されます。

<?php
$data = ["100", 100, "100"];
$unique = array_unique($data, SORT_REGULAR);
print_r($unique);
// 出力:Array ( [0] => 100 [1] => 100 )
?>

文字列の"100"と整数の100が別の値として扱われ、両方が残ります。

参考:PHP 公式マニュアル – array_unique

array_uniqueのよくある実装例

実際によくある場面を想定し、いくつかの実装例を紹介します。

タグやカテゴリの重複を除去する

<?php
$tags = ["PHP", "Laravel", "PHP", "JavaScript", "Laravel"];
$uniqueTags = array_unique($tags);
print_r($uniqueTags);
// 出力:Array ( [0] => PHP [1] => Laravel [3] => JavaScript )
?>

キーを振り直す(array_valuesとの組み合わせ)

array_unique()は元のキーを保持するため、キーが歯抜けになることがあります。
連番のキーに振り直したい場合は、array_values()と組み合わせましょう。

<?php
$fruits = ["りんご", "バナナ", "りんご", "みかん", "バナナ"];
$unique = array_values(array_unique($fruits));
print_r($unique);
// 出力:Array ( [0] => りんご [1] => バナナ [2] => みかん )
?>

キーが[0] [1] [2]と連番になり、扱いやすくなります。

連想配列の値で重複を削除する

連想配列の場合でも、array_unique()は値を基準に重複を除去してくれます。

<?php
$users = [
"user1" => "田中",
"user2" => "佐藤",
"user3" => "田中",
"user4" => "鈴木",
];
$unique = array_unique($users);
print_r($unique);
// 出力:Array ( [user1] => 田中 [user2] => 佐藤 [user4] => 鈴木 )
?>

array_uniqueを使うときの注意点

array_unique()は便利な関数ですが、初心者がハマりやすい注意点もあります。

  • 元の配列のキーがそのまま保持される
    重複を削除した後、キーが歯抜けになります。連番にしたい場合はarray_values()と組み合わせましょう。
  • 多次元配列には対応していない
    array_unique()は一次元配列にのみ対応しています。多次元配列の重複削除には別の方法が必要です。
  • デフォルトでは文字列として比較される
    型が異なる値(例:文字列の"1"と整数の1)も同じと判定されます。型も区別したい場合は、第2引数にSORT_REGULARを指定しましょう。

多次元配列の重複を削除したい場合の一例はこちらです。

<?php
$items = [
["id" => 1, "name" => "りんご"],
["id" => 2, "name" => "バナナ"],
["id" => 1, "name" => "りんご"],
];
$unique = array_unique(array_map('serialize', $items));
$result = array_values(array_map('unserialize', $unique));
print_r($result);
?>

serialize()で一度文字列化してから重複を判定し、その後unserialize()で元に戻すというテクニックです。

まとめ

今回は、PHPユーザー向けに、配列から重複データを削除する方法を紹介しました。

  • PHPで配列の重複を削除するならarray_unique()関数が一番簡単
  • 第2引数のソートフラグで、比較方法をカスタマイズできる
  • キーを振り直したい場合はarray_values()と組み合わせる
  • 多次元配列には直接対応していないので、serialize()などを活用する

array_unique()関数を使いこなすことで、データの整理や集計処理がかなりスムーズになります。
配列操作をさらに深く学びたい方は、PHPの配列関数一覧もチェックしてみましょう。

本記事で紹介した公式ドキュメント