【PHP8.x】array_unique関数の使い方

作成日: 更新日:

array_unique関数は、配列から重複する値を取り除き、ユニークな値のみを含む新しい配列を生成する関数です。

この関数は、与えられた配列内のすべての要素を比較し、重複する値が存在する場合、最初に出現した要素を残し、それ以降の重複する要素を排除します。結果として得られる新しい配列は、重複のない一意の要素のみで構成されます。デフォルトでは、元の配列のキーは維持されますが、値が重複して排除された要素のキーは失われます。

この関数は単一の配列を引数として受け取ります。オプションとして、要素の比較方法を指定する二つ目の引数(ソートフラグ)を渡すことができます。例えば、SORT_REGULAR(標準的な比較)、SORT_NUMERIC(数値として比較)、SORT_STRING(文字列として比較)、SORT_LOCALE_STRING(現在のロケールに基づいた文字列として比較)、SORT_FLAG_CASE(大文字小文字を区別しない文字列として比較)、SORT_A_CODE(型と値の両方を厳密に比較)などのフラグが利用可能です。これらのフラグを適切に選択することで、特定のデータ型に応じた正確な重複排除が可能となります。

array_unique関数は、重複が取り除かれた新しい配列を返します。この際、元の配列は一切変更されません。この機能は、ユーザーからの入力データから重複する項目を削除したり、データベースに登録する前に一意のデータセットを準備したりするなど、データの整理や整合性の確保が必要な様々な場面で非常に有効です。データの品質を保ち、不要な重複を排除することで、アプリケーションの効率性と信頼性を向上させることができます。適切な比較モードを選択することが、意図した結果を得るために重要です。

基本的な使い方

構文(syntax)

<?php
$input_array = [1, 2, 3, 2, 4, 5, 4];
$unique_array = array_unique($input_array);
?>

引数(parameters)

array $array, int $flags = SORT_STRING

  • array $array: 重複を除外する対象の配列
  • int $flags = SORT_STRING: 重複の比較方法を指定する整数。デフォルトは SORT_STRING

戻り値(return)

array

指定された配列から重複する値を取り除いた新しい配列を返します。元の配列のキーは保持されます。

サンプルコード

PHP array_uniqueで重複削除とキーを理解する

<?php

/**
 * array_unique関数の使用例。
 * 配列から重複する値を削除し、その際にキーがどのように扱われるかを示します。
 */
function demonstrateArrayUniqueWithKeys(): void
{
    // 重複する値と異なるキーを持つサンプル配列
    $data = [
        "id1" => "apple",
        "id2" => "banana",
        "id3" => "apple",    // "id1"と値が重複
        "id4" => "orange",
        "id5" => "banana",    // "id2"と値が重複
        0 => "grape",
        1 => "apple"         // "id1"と値が重複 (数値キー)
    ];

    echo "--- 元の配列 ---\n";
    print_r($data);

    // array_unique() を使用して重複する値を削除します。
    // デフォルトでは、値の比較は文字列として行われます (SORT_STRING)。
    // 重複する値がある場合、最初に見つかった要素のキーと値が保持されます。
    $uniqueData = array_unique($data);

    echo "\n--- array_unique() 適用後の配列 ---\n";
    print_r($uniqueData);

    // 結果の解説:
    // - "apple" の値は、最初に現れるキー "id1" の要素が保持されます。
    //   そのため、"id3" => "apple" と 1 => "apple" は削除されます。
    // - "banana" の値は、最初に現れるキー "id2" の要素が保持されます。
    //   そのため、"id5" => "banana" は削除されます。
    // - 残った要素のキーは、元の配列でその値が最初に見つかったときのキーがそのまま保持されます。
    //   array_uniqueは値に基づいて重複を判断し、キー自体を再インデックスすることはありません。
}

// 関数を実行して、array_uniqueの動作を確認します。
demonstrateArrayUniqueWithKeys();

PHPのarray_unique関数は、配列の中から重複する値を取り除き、一意な値のみを含む新しい配列を生成する際に使用されます。この関数は、引数として対象の配列を受け取り、オプションで値の比較方法を指定するフラグ(デフォルトはSORT_STRINGで文字列として比較します)を渡すことができます。戻り値は、重複が取り除かれた結果の新しい配列となります。

提供されたサンプルコードでは、複数のキーに同じ値が割り当てられている配列が用意されています。例えば、"id1""id3"1という異なるキーがすべて"apple"という値を持っています。array_unique関数を適用すると、これらの重複する"apple"の値のうち、最初に配列内で見つかった"id1" => "apple"の要素が保持され、他の"apple"を持つ要素は削除されます。同様に、"id2" => "banana"が保持され、"id5" => "banana"は削除されます。

ここで重要なのは、array_uniqueが値に基づいて重複を判断し、その値が最初に見つかった要素の「キー」と値をそのまま保持するという点です。重複が削除されても、残った要素のキーは元の配列から変更されずに引き継がれ、自動的に0, 1, 2...のように再インデックスされることはありません。この特性を理解することで、キーが持つ情報も考慮した上で、配列から重複する値を適切に処理することができます。

array_unique関数は配列から重複する値を削除しますが、最も重要な注意点は「キーの扱い」です。重複する値がある場合、最初に見つかった要素のキーと値が保持され、それ以降の重複は削除されます。この際、結果の配列のキーは元のキーがそのまま維持され、自動的に数値キーに再インデックスされることはありません。また、値の比較はデフォルトで文字列として行われるため、数値や異なる型の値が混在する場合は、SORT_NUMERICなどの適切な比較フラグを指定しないと予期しない結果になる可能性があります。特に、キーの維持を前提とした処理を行う際は注意が必要です。

PHP: array_uniqueで多次元配列の重複を削除する

<?php

/**
 * 多次元配列から重複するサブ配列を削除します。
 * 各サブ配列をJSON文字列に変換し、そのJSON文字列の重複を array_unique 関数で削除します。
 * その後、元の配列形式に戻します。
 *
 * @param array $multiArray 処理する多次元配列。
 * @return array 重複するサブ配列が削除された新しい多次元配列。
 * @throws JsonException JSONエンコードまたはデコード中にエラーが発生した場合。
 */
function getUniqueMultiDimensionalArray(array $multiArray): array
{
    $serializedSubArrays = [];
    foreach ($multiArray as $subArray) {
        // サブ配列をJSON文字列に変換し、その内容を比較可能にする
        // JSON_THROW_ON_ERROR はPHP 7.3以降で利用可能
        $serializedSubArrays[] = json_encode($subArray, JSON_THROW_ON_ERROR);
    }

    // JSON文字列の配列に対して array_unique を適用し、重複を削除
    // array_unique はデフォルトで SORT_STRING フラグを使用するため、文字列比較が行われる
    $uniqueSerializedSubArrays = array_unique($serializedSubArrays);

    $uniqueMultiArray = [];
    foreach ($uniqueSerializedSubArrays as $serializedSubArray) {
        // JSON文字列を元の配列形式に戻す
        $uniqueMultiArray[] = json_decode($serializedSubArray, true, 512, JSON_THROW_ON_ERROR);
    }

    return $uniqueMultiArray;
}

// 単体で動作確認するためのサンプルコード
if (isset($argv) && basename($argv[0]) === basename(__FILE__)) {
    $data = [
        ['id' => 1, 'name' => 'Alice'],
        ['id' => 2, 'name' => 'Bob'],
        ['id' => 1, 'name' => 'Alice'], // 重複するサブ配列
        ['id' => 3, 'name' => 'Charlie'],
        ['name' => 'Bob', 'id' => 2], // キーの順序が異なるため、別のサブ配列として扱われる
        ['id' => 4, 'name' => 'David'],
        ['id' => 1, 'name' => 'Alice'], // 重複するサブ配列
        ['id' => 5, 'name' => 'Eve'],
        ['id' => 6, 'name' => 'Frank'],
        ['id' => 6, 'name' => 'Frank'], // 重複するサブ配列
    ];

    echo "--- 元の多次元配列 ---\n";
    print_r($data);

    $uniqueData = getUniqueMultiDimensionalArray($data);

    echo "\n--- 重複を削除した多次元配列 ---\n";
    print_r($uniqueData);
}

?>

PHPのarray_unique関数は、配列の中から重複する値を取り除き、ユニークな値のみを含む新しい配列を返す組み込み関数です。この関数は引数として処理したい配列を受け取り、オプションで値の比較方法を指定するフラグを設定できます。デフォルトでは値を文字列として比較します。戻り値は重複が削除された新しい配列です。

このサンプルコードは、通常のarray_unique関数が直接処理できない「多次元配列」の中から、内容が完全に一致するサブ配列を削除する方法を初心者向けに示しています。array_uniqueは通常、数値や文字列のような一次元の値の重複を判断するため、配列の中にさらに配列が含まれる多次元配列にはそのまま適用できません。

そこで、このコードではまず、多次元配列の各サブ配列をjson_encode関数を使ってJSON形式の文字列に変換します。これにより、サブ配列の内容全体を一つの比較可能な文字列として扱えるようになります。次に、これらのJSON文字列の配列に対してarray_unique関数を適用することで、重複するサブ配列(JSON文字列)を効率的に削除します。最後に、重複が削除されたJSON文字列の配列をjson_decode関数で元の配列形式に戻し、結果として重複のない多次元配列が得られます。この手法により、システムは重複のないユニークなデータのみを保持し、データの整合性を高めることができます。

array_unique関数は、一次元配列の重複要素を削除するために設計されており、多次元配列には直接適用できません。サンプルコードは、多次元配列の重複を削除するために、各サブ配列をJSON文字列に変換し、そのJSON文字列の重複をarray_uniqueで処理した後、元の配列形式に戻すという工夫をしています。

この方法を利用する際は、サブ配列内のキーの順序が異なると、内容が同じであっても別のサブ配列として扱われる点に特にご注意ください。例えば、['id' => 1, 'name' => 'Alice']['name' => 'Alice', 'id' => 1]は異なるものと判断されます。また、複雑なデータ型や非UTF-8文字列を含むサブ配列の場合、JSON変換が失敗したり意図しない結果になる可能性があります。そのため、入力データの特性をよく確認し、json_encodejson_decodeJSON_THROW_ON_ERRORを使用するなど、適切なエラー処理を実装することが重要です。

【PHP8.x】array_unique関数の使い方 | いっしー@Webエンジニア