HOWTO · PHP

PHP で配列から重複した値を削除する

この記事では、PHP で配列から重複した値を削除する方法を紹介します。array_unique()関数も含まれています。

このページの内容

PHP 配列から重複値を削除するには、配列を array_unique() に渡します。戻り値は、同じものとして扱われる値の各グループから最初の値を残した配列です。残した値に対応するキーも維持されるため、重複を削除しても数値キーが連番になるとは限りません。

array_unique() で重複値を削除する

この関数は配列と、省略可能な比較フラグを受け取ります。基本形は array_unique($array) です。たとえば、リストに "red", "blue", "red" が含まれている場合、戻り値には最初の "red" と "blue" が残ります。元の配列が並べ替えられることはなく、残った値の順序も変わりません。重複を削除した配列を引き続き使うには、戻り値を変数に代入します。

このセクションのコードと表示されるラベルや出力は英語のままです。

$colors = ["red", "blue", "red", "green", "blue"];
$uniqueColors = array_unique($colors);

残る値とキーを理解する

選択したフラグのもとで値が等しいと判定されると、array_unique() は最初に見つけた値を残し、後から現れた一致する値を取り除きます。数値添字配列では、削除された要素の位置にキーの欠番が生じます。連想配列では、残った各値に元のキーがそのまま対応します。キーがレコードや名前を識別する場合には便利ですが、結果の添字が 0, 1, 2, ... と連続していると想定するコードでは注意が必要です。

この関数が削除するのは重複値であり、値やキーによる並べ替えは行いません。出力順が重要な場合は、残った値が元の相対順序を保つことを覚えておきましょう。表示順ではなく、データ上どの値を同じものとして扱うかに基づいて比較フラグを選びます。

比較フラグを選ぶ

省略可能な $flags 引数で比較方法を指定します。既定値の SORT_STRING は値を文字列として比較します。SORT_REGULAR は PHP の通常の比較を使い、SORT_NUMERIC は値を数値として比較し、SORT_LOCALE_STRING は現在のロケールに従って文字列を比較します。フラグによって重複と判定される値は変わりますが、戻り値が並べ替えられるわけではありません。そのため、型が混在する値はフラグによって重複の扱いが異なることがあります。データの意味に合った方法を選び、数値比較によって値の順序も変わると思い込まないようにしてください。

必要に応じて結果を再インデックスする

後続のコードで数値キーが連続したリストが必要な場合は、重複を削除した結果を array_values() に渡します。保持された値の順序を保ったまま、新しい数値添字配列が作られます。商品 ID やラベルのようにキーに意味がある場合はキーを維持し、利用側が通常のリストを必要とするときだけ再インデックスしてください。再インデックスは別の処理であり、array_unique() が自動で行うものではありません。

PHP の例で結果を確認する

次の完全な例を実行すると、残る値と再インデックスの効果を確認できます。

このセクションのコードと表示されるラベルや出力は英語のままです。

$items = ["first" => "pear", "second" => "plum", "third" => "pear", "fourth" => "lime"];
$uniqueItems = array_unique($items);
$listItems = array_values($uniqueItems);

echo "Unique values with original keys:\n";
print_r($uniqueItems);
echo "Same values with consecutive keys:\n";
print_r($listItems);

最初の結果では first、second、fourth のキーが保たれ、後から現れた pear の項目が取り除かれます。再インデックス後も値とその順序は同じですが、キーは連続した数値になります。この違いを理解しておくと、レコードのキーを維持するか、通常の数値添字を前提とするコード向けにリストを用意するかを判断できます。