PHPにはarray_uniqueという組み込み関数があります。
PHP: array_unique – Manual
効果は次の引用の通りシンプルで配列の中身をユニークなものにします。
array_unique
( array$array
[, int$sort_flags
= SORT_STRING
] ) : array
array
を入力とし、値に重複のない新規配列を返します。
この第二引数sort_flagsはsortなどとついていますが、実質的にcompare_flagsともいうべきものです。array_uniqueは次の通りに配列の中身の値を扱って比較します。
SORT_REGULAR
– 通常の比較
(型変換をしない) を行いますSORT_NUMERIC
– 数値として比較しますSORT_STRING
– 文字列として比較しますSORT_LOCALE_STRING
–
現在のロケールにもとづいて文字列として比較します。
ちなみにデフォルトはSORT_STRINGです。数値、文字列以外はSORT_REGULARでそれっぽく動きます。
注意:
array_unique() は、
多次元配列での使用を想定したものではないことに注意しましょう。
それっぽいといった通り、多重配列であったり配列の中身の型がまちまちだった場合、array_uniqueは意図しない挙動を起こしだします。この問題は昔からあった様で解決策はPHP: array_unique – Manual #97285にありました。
recursive array unique for multiarrays <?php function super_unique($array) { $result = array_map("unserialize", array_unique(array_map("serialize", $array))); foreach ($result as $key => $value) { if ( is_array($value) ) { $result[$key] = super_unique($value); } } return $result; }
やっていることは配列の中身をserialize(値の保存可能な表現を生成)し、配列の中身を一旦全て文字列に変換、array_uniqueを実行、unserializeで元の型に復元、です。このsuper_uniqueを用いることでより直感的なarray_uniqueの挙動を実現できます。