eyecatch php

PHP

【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]

あまりスマートではない気はしますね。

-PHP
-, , , , ,