
【php】array_unique関数で重複した値を削除するまとめ
2019/09/06
phpのarray_unique関数で重複した値を削除する(まとめる)方法を備忘録としてポストします。
配列の重複値を削除 array_unique()
仕様
リファレンスから転載します。
array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )
array を入力とし、値に重複のない新規配列を返します。
キーは保持されることに注意してください。 array_unique() はまず文字列として値をソートし、 各値の最初のキーを保持し、2回目以降の全てのキーを無視します。 これは、ソート前の array で最初の関連する値のキーが保持されるという意味ではありません。
実際に使ってみる 1次元配列編
例1
[php]
$arr = array('aaa', 'aaa', 'bbb', 'bbb', 'ccc');
$res = array_unique($arr);
[/php]
例1の結果
[php]
Array
(
[0] => aaa
[2] => bbb
[4] => ccc
)
[/php]
重複している値の内、最初の値が残っています。
例2
[php]
$arr = array('aaa', 'aaa', 'aaa', 'aaa', 'bbb', 'bbb', 'bbb', 'ccc', 'ddd');
$res = array_unique($arr);
[/php]
例2の結果
[php]
Array
(
[0] => aaa
[4] => bbb
[7] => ccc
[8] => ddd
)
[/php]
複数の重複でも最初の値を残して削除されます。
ccc,dddのように重複がない場合はそのままとなります。
多次元配列編
では、多次元配列の場合はどうなるのだということで、試してみます。
例3
[php]
$arr = array(
array('aaa', 'aaa', 'bbb', 'ccc'),
array('aaa', 'aaa', 'bbb', 'ccc'),
array('ddd', 'ddd', 'eee', 'fff'),
);
$res = array_unique($arr);
[/php]
例3の結果
[php]
Array
(
[0] => Array
(
[0] => aaa
[1] => aaa
[2] => bbb
[3] => ccc
)
)
[/php]
これは欲しい結果ではないですね。
例4
第二引数に「SORT_REGULAR」を指定してみます。
[php]
$arr = array(
array('aaa', 'aaa', 'bbb', 'ccc'),
array('aaa', 'aaa', 'bbb', 'ccc'),
array('ddd', 'ddd', 'eee', 'fff'),
);
$res = array_unique($arr, SORT_REGULAR);
[/php]
例4の結果
[php]
Array
(
[0] => Array
(
[0] => aaa
[1] => aaa
[2] => bbb
[3] => ccc
)
[2] => Array
(
[0] => ddd
[1] => ddd
[2] => eee
[3] => fff
)
)
[/php]
valueとして「同じ配列」がある場合は削除されているようですね。
例5
下記のようにすると、
[php]
$arr = array(
array('aaa', 'aaa', 'bbb', 'ccc'),
array('aaa', 'aaa', 'bbb', 'ggg'), // ←cccをgggに変更
array('ddd', 'ddd', 'eee', 'fff'),
);
$res = array_unique($arr, SORT_REGULAR);
[/php]
例5の結果
[php]
Array
(
[0] => Array
(
[0] => aaa
[1] => aaa
[2] => bbb
[3] => ccc
)
[1] => Array
(
[0] => aaa
[1] => aaa
[2] => bbb
[3] => ggg
)
[2] => Array
(
[0] => ddd
[1] => ddd
[2] => eee
[3] => fff
)
)
[/php]
重複する配列がないので、全て帰ってきます。
例6
予想はつきますが、例5の結果配列を foreach で回しながら array_unique すると、さらに重複を削除した結果が得られます。
[php]
$arr = array(
array('aaa', 'aaa', 'bbb', 'ccc'),
array('aaa', 'aaa', 'bbb', 'ggg'),
array('ddd', 'ddd', 'eee', 'fff'),
);
$res = array_unique($arr, SORT_REGULAR);
$res2 = array();
foreach ($res AS $v) {
$res2[] = array_unique($v);
}
[/php]
例6の結果
[php]
Array
(
[0] => Array
(
[0] => aaa
[2] => bbb
[3] => ccc
)
[1] => Array
(
[0] => aaa
[2] => bbb
[3] => ggg
)
[2] => Array
(
[0] => ddd
[2] => eee
[3] => fff
)
)
[/php]
あまりスマートではない気はしますね。