【PHP8.x】array_uintersect()関数の使い方
array_uintersect関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
array_uintersect関数は、複数の配列の共通する要素を、ユーザーが定義した比較関数を使って抽出する関数です。この関数は、単に値が厳密に等しい要素だけでなく、プログラマが指定した独自のロジック(例えば、オブジェクトの特定のプロパティやカスタムデータ構造の比較基準など)に基づいて共通部分を判断したい場合に非常に有用です。
具体的には、第一引数には比較の基準となる最初の配列を指定し、その後ろには一つ以上の比較対象となる配列を続けます。そして、最後の引数として、2つの要素を比較してその順序関係を示す整数を返すコールバック関数を渡します。このコールバック関数は、比較対象の最初の要素が2番目の要素より小さい場合は負の数、等しい場合はゼロ、大きい場合は正の数を返さなければなりません。
array_uintersect関数は、最初の配列の各要素を取り出し、それが他のすべての引数として渡された配列のそれぞれに、ユーザー定義の比較関数によって「等しい」(コールバック関数がゼロを返す)と判断される要素が存在する場合に、その最初の配列の要素を結果の配列に含めます。結果として返される配列のキーは、最初の配列のキーがそのまま保持されます。この柔軟な比較機能により、オブジェクトの特定のプロパティや複雑なデータ構造に基づいて、複数の配列から共通のデータを効率的に見つけ出すことが可能になります。
構文(syntax)
1<?php 2 3function compare_strings($a, $b) { 4 return strcmp($a, $b); 5} 6 7$array1 = ["a" => "apple", "b" => "banana", "c" => "cherry"]; 8$array2 = ["a" => "orange", "b" => "banana", "d" => "cherry"]; 9$array3 = ["e" => "grape", "f" => "banana", "g" => "kiwi", "h" => "cherry"]; 10 11$intersected_array = array_uintersect($array1, $array2, $array3, "compare_strings"); 12 13print_r($intersected_array); 14 15?>
引数(parameters)
array $array1, array $array2, array ...$arrays, callable $value_compare_func
- array $array1: 比較対象となる配列の1つ目
- array $array2: 比較対象となる配列の2つ目
- array ...$arrays: 比較対象となる追加の配列
- callable $value_compare_func: 配列の要素の値を比較するためのコールバック関数
戻り値(return)
array
callback関数によって比較された結果、両方の配列に共通して存在する要素のみで構成された新しい配列を返します。
サンプルコード
array_uintersectで大文字小文字を区別せずに共通要素を抽出する
1<?php 2 3/** 4 * array_uintersect の使用例 5 * 6 * このスクリプトは、ユーザー定義の比較関数を使用して配列の共通要素を比較・抽出します。 7 * `array_uintersect` は、要素の値の比較方法をカスタマイズしたい場合に特に有用です。 8 * この例では、文字列を大文字・小文字を区別せずに比較し、共通の要素を見つけます。 9 */ 10 11// 比較対象となる2つの配列を定義します。 12$array1 = ["Apple", "Banana", "orange", "Grape", "Melon"]; 13$array2 = ["banana", "ORANGE", "Kiwi", "apple"]; 14 15/** 16 * ユーザー定義の比較関数 17 * 18 * この関数は array_uintersect に渡され、2つの値を比較します。 19 * - 値1が値2より小さい場合、負の整数を返します。 20 * - 値1が値2より大きい場合、正の整数を返します。 21 * - 両方の値が等しい場合、0を返します。 22 * 23 * この例では、strcasecmp を使用して、文字列を大文字・小文字を区別せずに比較します。 24 * 25 * @param string $a 比較する最初の値 26 * @param string $b 比較する2番目の値 27 * @return int 比較結果を示す整数 28 */ 29$caseInsensitiveCompare = function (string $a, string $b): int { 30 return strcasecmp($a, $b); 31}; 32 33// array_uintersect を使用して、大文字・小文字を区別せずに共通の要素を抽出します。 34$result = array_uintersect($array1, $array2, $caseInsensitiveCompare); 35 36echo "元の配列1: " . implode(", ", $array1) . PHP_EOL; 37echo "元の配列2: " . implode(", ", $array2) . PHP_EOL; 38echo "大文字・小文字を区別しない共通要素 (array_uintersect): " . implode(", ", $result) . PHP_EOL; 39 40// 期待される出力: 41// 元の配列1: Apple, Banana, orange, Grape, Melon 42// 元の配列2: banana, ORANGE, Kiwi, apple 43// 大文字・小文字を区別しない共通要素 (array_uintersect): Apple, Banana, orange 44// (または apple, banana, ORANGE - array_uintersect は最初の配列の値を保持します) 45 46?>
PHPのarray_uintersect関数は、複数の配列から共通する要素を抽出する際に、ユーザーが定義した比較ルールを適用できる点が特徴です。標準のarray_intersect関数とは異なり、要素の値の比較方法を細かく制御したい場合に大変役立ちます。
この関数は、比較対象となる複数の配列を引数として受け取ります。最後の引数には、2つの値を比較してその順序関係を示す整数(負の数、0、正の数)を返すコールバック関数を指定します。このコールバック関数が、要素同士を比較し、共通性を判断する基準となります。関数が返す配列には、渡されたすべての配列に存在する共通要素が含まれますが、値は最初の配列($array1)から取得されます。
サンプルコードでは、array_uintersectを用いて、文字列を大文字・小文字を区別せずに比較し、共通の要素を見つける方法を示しています。ここではstrcasecmpという組み込み関数を利用した匿名関数を比較関数として定義しています。これにより、「Apple」と「apple」、「orange」と「ORANGE」を同じ要素として認識し、共通部分として抽出することが可能です。このように、独自の比較ロジックを適用して配列の共通要素を見つけたい場合にarray_uintersectは非常に有用です。
array_uintersect関数は、通常のarray_intersectと異なり、値を比較する独自のルールを定義できる点が重要です。提供する比較関数は、2つの値を引数に取り、最初の値が小さい場合は負、大きい場合は正、等しい場合はゼロの整数を返すように実装してください。この戻り値が正しくないと、意図しない結果になる可能性があります。結果として返される配列には、最初の引数として渡した配列からの値が含まれます。他の配列に同じ共通要素があっても、常に最初の配列の値が採用される点にご注意ください。比較関数に型宣言を使用すると、コードの安全性が高まりますので、積極的に活用することをおすすめします。
PHP array_uintersectで共通値を見つける
1<?php 2 3/** 4 * array_uintersect の基本的な使用例 5 * 6 * 複数の配列から、ユーザー定義の比較関数に基づいて共通する値を抽出します。 7 * この関数は配列の「値」を比較し、共通する要素を返します。 8 * array_intersect_key 関数が「キー」を比較するのに対し、 9 * array_uintersect は「値」を比較する点が異なります。 10 */ 11 12/** 13 * 大文字小文字を区別せずに文字列を比較するコールバック関数。 14 * 15 * array_uintersect はこの関数を使い、2つの値を比較します。 16 * 負の数を返すと $a が $b より小さい、正の数を返すと $a が $b より大きい、 17 * 0 を返すと $a と $b が等しいと判断されます。 18 * 19 * @param string $a 比較する最初の文字列 20 * @param string $b 比較する2番目の文字列 21 * @return int 負の数、正の数、または 0 22 */ 23function compareStringsCaseInsensitive(string $a, string $b): int 24{ 25 // strcasecmp は大文字小文字を区別しない文字列比較を行います。 26 return strcasecmp($a, $b); 27} 28 29// 最初の配列を定義します。 30$array1 = [ 31 'fruit_a' => 'Apple', 32 'fruit_b' => 'Banana', 33 'fruit_c' => 'Orange', 34 'fruit_d' => 'Grape', 35]; 36 37// 2番目の配列を定義します。 38// array1 と一部共通する値を含みますが、大文字小文字が異なる場合もあります。 39$array2 = [ 40 'item_x' => 'apple', // 'Apple' と大文字小文字を無視すれば一致 41 'item_y' => 'Grape', 42 'item_z' => 'Mango', 43 'item_w' => 'banana', // 'Banana' と大文字小文字を無視すれば一致 44]; 45 46// 3番目の配列を定義します。(オプション) 47$array3 = [ 48 'produce_1' => 'apple', 49 'produce_2' => 'Kiwi', 50 'produce_3' => 'Banana', // 'Banana' と大文字小文字を無視すれば一致 51]; 52 53echo "--- 元の配列 ---" . PHP_EOL; 54echo "配列1: " . print_r($array1, true); 55echo "配列2: " . print_r($array2, true); 56echo "配列3: " . print_r($array3, true); 57 58// array_uintersect を使用して、大文字小文字を区別せずに共通する値を抽出します。 59// 比較関数として 'compareStringsCaseInsensitive' を指定します。 60// 結果の配列のキーは維持されず、新しい数値キーが割り当てられます。 61$commonValues = array_uintersect($array1, $array2, $array3, 'compareStringsCaseInsensitive'); 62 63echo "--- array_uintersect の結果 (共通値) ---" . PHP_EOL; 64echo "結果: " . print_r($commonValues, true); 65 66/* 67このコードを実行すると、以下の結果が出力されます。 68 69--- 元の配列 --- 70配列1: Array 71( 72 [fruit_a] => Apple 73 [fruit_b] => Banana 74 [fruit_c] => Orange 75 [fruit_d] => Grape 76) 77配列2: Array 78( 79 [item_x] => apple 80 [item_y] => Grape 81 [item_z] => Mango 82 [item_w] => banana 83) 84配列3: Array 85( 86 [produce_1] => apple 87 [produce_2] => Kiwi 88 [produce_3] => Banana 89) 90--- array_uintersect の結果 (共通値) --- 91結果: Array 92( 93 [0] => Apple 94 [1] => Banana 95 [2] => Grape 96) 97 98解説: 99- 'Apple' (array1), 'apple' (array2), 'apple' (array3) は比較関数により共通と判断され、 100 array1 から見つかった値 'Apple' が結果に含まれます。 101- 'Banana' (array1), 'banana' (array2), 'Banana' (array3) も同様に共通と判断され、 102 array1 から見つかった値 'Banana' が結果に含まれます。 103- 'Grape' (array1), 'Grape' (array2) は共通と判断され、 104 array1 から見つかった値 'Grape' が結果に含まれます。 105- array_uintersect は共通要素の値を最初の配列から取得し、結果のキーは新しい数値キーとなります。 106*/
array_uintersect関数は、複数の配列の中から「共通する値」を、開発者が定義した比較ルール(コールバック関数)に基づいて見つけ出し、新しい配列として返すPHPの関数です。この関数は配列の「値」に着目して比較を行うため、キーを比較するarray_intersect_key関数とは異なる点にご注意ください。
引数には、比較対象となる複数の配列と、値の比較方法を定義するcallable型の関数を指定します。この比較関数は、2つの値を引数として受け取り、最初の値が2番目の値より小さい場合は負の数、大きい場合は正の数、等しい場合はゼロを返します。戻り値は、共通する値だけを含む新しい配列で、そのキーは元の配列から引き継がれず、自動的に0から始まる数値キーが割り当てられます。共通と判断された値は、最初の引数として渡された配列から取得されます。
上記のサンプルコードでは、compareStringsCaseInsensitiveというコールバック関数を定義し、大文字と小文字を区別せずに文字列を比較するように設定しています。$array1、$array2、$array3の3つの配列をarray_uintersectでこのコールバック関数を使って比較すると、「Apple」「Banana」「Grape」が大文字小文字を無視して共通の文字列と判断されます。例えば、$array1の'Apple'、$array2の'apple'、$array3の'apple'が等しいと判断され、結果には$array1から取得された'Apple'が格納されます。これにより、ユーザー定義の柔軟な条件で共通要素を抽出できます。
array_uintersectは、複数の配列から「値」をユーザー定義の比較関数に基づいて共通要素として抽出する関数です。キーではなく値が比較対象であるため、キーを比較するarray_intersect_keyとは用途が異なりますのでご注意ください。値の比較は、引数で渡すコールバック関数の戻り値(負、0、正)によって行われます。0を返した場合に等しいと判断されますので、比較ロジックが意図通りか確認することが重要です。また、結果の配列には、共通と判断された要素が最初の配列($array1)から取得され、そのキーは元の配列のキーではなく、0から始まる新しい数値キーに再割り当てされます。このキーの扱いに注意し、必要に応じてarray_udiff_assocなどの別の関数も検討してください。