分類

    Qumeru

    array_unique関数 | PHP関数リファレンス

    利用できるPHPのバージョンPHP 4 >= 4.0.1, PHP 5, PHP 7

    array_unique関数とは

    PHPのarray_unique関数は、配列から重複した値を削除し、ユニークな値の配列を抽出する事ができます。

    第二引き数によっては、値の重複判定が異るケースがあります。第二引き数の設定による違いをサンプルコードと共にご紹介します。

    array_unique関数の使い方

    構文

    array_unique( 配列, ソートオプション );

    パラメータ

    array_unique関数の第一引き数へは、重複した値を削除したい配列をセットします。

    第二引き数はソートオプションとなっていますが、削除後の配列の並び替えをしてくれる訳ではなく、値を削除する為に内部的に並び替える為のルールになります。


    array_unique関数の内部的な動きは下記の様な処理を行っています。

    1. 第一引き数でセットされた配列をソートオプションの条件で昇順に並び替えを行う
    2. 配列の要素数分、1つ前の値と同じかを比較し続け、異なる値のキーのみを保持するという動作を繰り返す
    その為、ソートオプションは値の比較を行う型という認識で選択する事になります。


    ソートオプションで指定できるパラメータは下記4つです。
    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関数を使った例

    配列のユニークな値が欲しいケースはたくさんありますが、ここでは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関数を用いて配列の中に同じ値があるかチェックするには、
    配列内の重複する値を削除し、配列の数を比較する事で 同じ値が存在するかをチェックする事ができます。

    詳しいフローについては下記リンクで紹介しています。

    PHPで配列の中に同じ値があるかチェックする方法を解説!のイメージ
    PHPで配列の中に同じ値があるかチェックする方法を解説!
    PHPで配列の中に重複する値が存在するかをチェックする方法についてご紹介します。型の異なる値のチェックについてもサンプルコードと共に解説していきます。

    array_unique関数の注意点

    array_unique関数では、配列のインデックスが保持される為、重複した値が削除されると添字配列のインデックスは飛び飛びになってしまいます。連番だと思い込んでfor文で添え字を使ってしまうと、想定外の障害が発生してしまうことがあるので注意してください。