利用できるPHPのバージョン | PHP 4 >= 4.0.1, PHP 5, PHP 7 |
---|
PHPのarray_unique
関数は、配列から重複した値を削除し、ユニークな値の配列を抽出する事ができます。
第二引き数によっては、値の重複判定が異るケースがあります。第二引き数の設定による違いをサンプルコードと共にご紹介します。
array_unique( 配列, ソートオプション );
array_unique
関数の第一引き数へは、重複した値を削除したい配列をセットします。
第二引き数はソートオプションとなっていますが、削除後の配列の並び替えをしてくれる訳ではなく、値を削除する為に内部的に並び替える為のルールになります。
array_unique
関数の内部的な動きは下記の様な処理を行っています。
SORT_REGULAR | 型変換をしない (※)初期値 |
SORT_NUMERIC | 数値として比較 |
SORT_STRING | 文字列として比較 |
SORT_LOCALE_STRING | 現在のロケールにもとづいて文字列として比較 |
第一引き数用の配列
$variables = [1, '01', '10', '3', '1', '10', '3', 1, 10];
ソートオプションは値の比較を行う型を指定する為、サンプルの配列にはString
型とint
型の値を含めてみました。
'01'
と'1'
の値に注目しながら確認してみましょう。
SORT_REGULARは型変換をしないので、PHPの暗黙的な型変換が行われています。
String
型の'01'
と'1'
、int
型の1が同じ値として判定されていますね。
SORT_NUMERICは数値として比較するので、配列要素のint
型へ変換可能な値はint
型へ変換され比較されています。その結果String
型の'01'
と'1'
、int
型の1が同じ値として判定されています。
SORT_STRINGは文字列として比較するので、配列要素は全てString
型へ変換され比較されています。その結果String
型の'01'
と'1'
は別の値として判定されています。
SORT_LOCALE_STRINGは、現在のロケールにもとづいて文字列として比較されるのですがロケールとは言語と地域の事を指します。ロケールの設定に限らず、言語は文字列の為、基本的には文字列として比較されます。利用するロケールは setlocale
関数で変更できます。
array_unique
関数の戻り値は、重複する値が削除されたユニークな配列です。
戻り値の配列のインデックスは、パラメータで指定した配列と変わりません。array_unique
関数の内部処理で並び替えられた値の内、始めに出現した要素のインデックスが残る為です。
array_unique
関数は、多次元配列には適していないため、パラメータで指定した多次元配列の最初の配列が戻ります。
配列のユニークな値が欲しいケースはたくさんありますが、ここではarray_unique
関数の資料例を2つご紹介したいと思います。
従業員一覧の名簿から、ユニークな部署名の一覧を表示したい場合にarray_unique
関数は非常に便利な関数です。
それでは順にフローを解説したいと思います。
名簿の配列
$variables = [
['id' => '0001', 'name' => '山口 太郎', 'department' => '営業部'],
['id' => '0002', 'name' => '広島 太郎', 'department' => '総務部'],
['id' => '0003', 'name' => '鳥取 花子', 'department' => '営業部'],
['id' => '0004', 'name' => '島根 太郎', 'department' => '人事部'],
['id' => '0005', 'name' => '岡山 太郎', 'department' => '開発部'],
['id' => '0006', 'name' => '高知 花子', 'department' => '営業部'],
['id' => '0007', 'name' => '愛媛 太郎', 'department' => '営業部'],
['id' => '0008', 'name' => '福島 太郎', 'department' => '総務部'],
['id' => '0009', 'name' => '香川 花子', 'department' => '開発部'],
['id' => '0010', 'name' => '山田 太郎', 'department' => '経理部'],
];
まずは名簿の入った配列から、部署名のカラムだけを抽出します。
departmentカラムを抽出
$departments = array_column( $variables, 'department');
取得した$departments
から重複した値を削除します。
重複した値の削除
array_unique( $departments );
それぞれの関数の実行結果を、サンプルコードで確認してみましょう。
名簿一覧の配列から、ユニークな部署名を取得する事ができました。
array_unique
関数を用いて配列の中に同じ値があるかチェックするには、
配列内の重複する値を削除し、配列の数を比較する事で 同じ値が存在するかをチェックする事ができます。
詳しいフローについては下記リンクで紹介しています。
array_unique
関数では、配列のインデックスが保持される為、重複した値が削除されると添字配列のインデックスは飛び飛びになってしまいます。連番だと思い込んでfor
文で添え字を使ってしまうと、想定外の障害が発生してしまうことがあるので注意してください。