【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
1 2 |
$arr = array('aaa', 'aaa', 'bbb', 'bbb', 'ccc'); $res = array_unique($arr); |
例1の結果
1 2 3 4 5 6 |
Array ( [0] => aaa [2] => bbb [4] => ccc ) |
重複している値の内、最初の値が残っています。
例2
1 2 |
$arr = array('aaa', 'aaa', 'aaa', 'aaa', 'bbb', 'bbb', 'bbb', 'ccc', 'ddd'); $res = array_unique($arr); |
例2の結果
1 2 3 4 5 6 7 |
Array ( [0] => aaa [4] => bbb [7] => ccc [8] => ddd ) |
複数の重複でも最初の値を残して削除されます。
ccc,dddのように重複がない場合はそのままとなります。
多次元配列編
では、多次元配列の場合はどうなるのだということで、試してみます。
例3
1 2 3 4 5 6 7 |
$arr = array( array('aaa', 'aaa', 'bbb', 'ccc'), array('aaa', 'aaa', 'bbb', 'ccc'), array('ddd', 'ddd', 'eee', 'fff'), ); $res = array_unique($arr); |
例3の結果
1 2 3 4 5 6 7 8 9 10 11 |
Array ( [0] => Array ( [0] => aaa [1] => aaa [2] => bbb [3] => ccc ) ) |
これは欲しい結果ではないですね。
例4
第二引数に「SORT_REGULAR」を指定してみます。
1 2 3 4 5 6 7 |
$arr = array( array('aaa', 'aaa', 'bbb', 'ccc'), array('aaa', 'aaa', 'bbb', 'ccc'), array('ddd', 'ddd', 'eee', 'fff'), ); $res = array_unique($arr, SORT_REGULAR); |
例4の結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Array ( [0] => Array ( [0] => aaa [1] => aaa [2] => bbb [3] => ccc ) [2] => Array ( [0] => ddd [1] => ddd [2] => eee [3] => fff ) ) |
valueとして「同じ配列」がある場合は削除されているようですね。
例5
下記のようにすると、
1 2 3 4 5 6 7 |
$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); |
例5の結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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 ) ) |
重複する配列がないので、全て帰ってきます。
例6
予想はつきますが、例5の結果配列を foreach で回しながら array_unique すると、さらに重複を削除した結果が得られます。
1 2 3 4 5 6 7 8 9 10 11 12 |
$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); } |
例6の結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 ) ) |
あまりスマートではない気はしますね。