PHPで複数の配列を比較して、共通部分を簡単に取得する方法として、array_intersect
関数が非常に有効です。特に、複数のデータセットやフィルタリングが必要な場面では、データの共通点を効率的に見つけることができ、冗長なコードを避けることができます。この記事では、array_intersect
を使って、シンプルな配列の比較から複雑な状況での応用例まで、さまざまな使い方を丁寧に解説します。PHPで配列を操作する際に役立つテクニックを学び、より効率的なコードを書けるようになりましょう。
array_intersectとは
array_intersect
は、PHPの標準関数の一つで、複数の配列を比較し、それらの配列に共通する要素のみを抽出して返す機能を持っています。この関数は、配列操作において非常に便利で、特にデータのフィルタリングや共通項の抽出を行いたい場合に効果的です。
構文は以下の通りです:
array_intersect(array $array1, array $array2, array ...);
この関数は、最初の配列($array1
)と他の配列($array2
以降)の共通部分を比較し、その結果を返します。比較はデフォルトで要素の値に基づいて行われ、順序は維持されますが、キーは無視されます。
例えば、次のように使用します:
$array1 = [1, 2, 3, 4, 5];
$array2 = [3, 4, 5, 6, 7];
$result = array_intersect($array1, $array2);
print_r($result); // [3, 4, 5]
このように、共通する要素である3, 4, 5
が結果として得られます。
配列の比較の基礎
PHPにおける配列の比較は、主に「要素の値」を基準に行われます。配列同士を比較する際に考慮すべき基本的な点として、順序と型があります。array_intersect
関数では、配列内の値が同じであれば共通部分として認識され、順序やキーは比較対象にはなりません。
配列の値による比較
array_intersect
は、配列の要素を一つずつ比較し、同じ値を持つ要素を抽出します。比較されるのは「値」だけであり、キーや順序は無視されるため、同じ値が含まれていれば、それらは共通要素として結果に含まれます。
例えば次の配列の場合:
$array1 = [1, 2, 3, 4];
$array2 = [4, 3, 2, 1];
$result = array_intersect($array1, $array2);
print_r($result); // [1, 2, 3, 4]
この場合、両方の配列に同じ値(1, 2, 3, 4)が含まれているため、順序に関わらず結果としてすべての値が返されます。
型の厳密な比較について
PHPは、デフォルトでは「緩やかな型付け(loose typing)」を採用しているため、array_intersect
では同じ値と見なされる要素が異なるデータ型でも共通部分として扱われます。たとえば、文字列と整数の比較があっても、同じ値として扱われる可能性があります。
$array1 = [1, "2", 3];
$array2 = ["1", 2, 3];
$result = array_intersect($array1, $array2);
print_r($result); // [1, 3]
この例では、"2"
と 2
は異なる型ですが、array_intersect
は値が同じであるため、両者の共通要素として扱われません。しかし、型に関わらず数値1
と 3
は同じ値と見なされ、結果に含まれます。
このように、array_intersect
の動作はPHPの比較方法に基づいており、配列の要素をどのように比較するかを理解することが重要です。
array_intersectの基本的な使用例
array_intersect
関数を使うと、複数の配列から共通部分を簡単に取得することができます。ここでは、基本的な例を通じて、array_intersect
の使い方を具体的に説明します。
シンプルな2つの配列の比較
以下は、2つの配列から共通の要素を取得する基本的な例です:
$array1 = [1, 2, 3, 4, 5];
$array2 = [3, 4, 5, 6, 7];
$result = array_intersect($array1, $array2);
print_r($result); // [3, 4, 5]
この例では、$array1
と$array2
の両方に存在する値である3, 4, 5
が共通要素として結果に返されています。array_intersect
関数は順序やキーを無視して値のみを比較するため、どの順番で要素が登場しても問題なく動作します。
3つ以上の配列を比較する例
array_intersect
は2つ以上の配列にも対応しており、複数の配列の共通要素を取得することができます。次の例では、3つの配列の共通部分を取得しています。
$array1 = [1, 2, 3, 4, 5];
$array2 = [3, 4, 5, 6, 7];
$array3 = [4, 5, 8, 9];
$result = array_intersect($array1, $array2, $array3);
print_r($result); // [4, 5]
この例では、$array1
、$array2
、および$array3
の3つの配列全てに共通する要素は4
と5
であるため、その2つの値が結果として返されます。
キーを保持した結果の取得
通常、array_intersect
は共通部分の「値」のみを返し、キーは無視されます。しかし、元のキーを保持して結果を得たい場合もあります。この場合、array_intersect_assoc
関数を使います。これにより、キーと値の両方が一致する要素のみが共通部分として返されます。
$array1 = ['a' => 1, 'b' => 2, 'c' => 3];
$array2 = ['a' => 1, 'b' => 4, 'c' => 3];
$result = array_intersect_assoc($array1, $array2);
print_r($result); // ['a' => 1, 'c' => 3]
この例では、キーと値が両方一致する'a' => 1
と 'c' => 3
が共通部分として返されます。
array_intersect
は、シンプルな比較から複数の配列の処理まで幅広い場面で活用でき、効率的に共通部分を抽出する強力なツールです。
複数の配列を比較する方法
array_intersect
関数は、2つ以上の配列を比較して、複数の配列の共通部分を抽出するのに便利です。複数の配列を扱うときに重要なのは、各配列に共通して含まれる要素だけを結果として得る点です。このセクションでは、3つ以上の配列を比較する具体的な方法について解説します。
3つ以上の配列を比較する場合
array_intersect
は、2つの配列だけでなく、3つ以上の配列を同時に比較することが可能です。以下の例では、3つの配列の共通部分を取得しています。
$array1 = [1, 2, 3, 4, 5];
$array2 = [3, 4, 5, 6, 7];
$array3 = [4, 5, 8, 9];
$result = array_intersect($array1, $array2, $array3);
print_r($result); // [4, 5]
この例では、$array1
、$array2
、および$array3
の全てに共通する要素である4
と5
が結果として返されます。3つの配列にまたがって共通する要素が少ないため、結果として返される要素も限られています。
実際の用途:重複するデータのフィルタリング
複数のデータソースからデータを取得し、それらのデータセットに共通する要素を見つけたい場合、array_intersect
が非常に役立ちます。例えば、次のようなシナリオを考えてみましょう。
$array1
は、ある年に購入された商品のリスト$array2
は、異なる年に購入された商品のリスト$array3
は、さらに別の年に購入された商品のリスト
これらの配列を比較することで、全ての年で共通して購入された商品を見つけることができます。
$array1 = ['apple', 'banana', 'orange'];
$array2 = ['banana', 'orange', 'grape'];
$array3 = ['orange', 'banana', 'pineapple'];
$result = array_intersect($array1, $array2, $array3);
print_r($result); // ['banana', 'orange']
この例では、全ての配列に共通する商品である「banana」と「orange」が結果として返されます。このように、複数の配列から共通の要素を抽出するのにarray_intersect
が効果的です。
配列の数が多くなる場合の注意点
複数の配列を比較する際、配列の数が増えれば増えるほど、共通部分が少なくなる可能性があります。また、非常に大きな配列を扱う場合、パフォーマンスにも影響を与えることがあります。そのため、配列のサイズや数に応じて適切に処理を設計することが重要です。
array_intersect
を使うことで、簡単に複数の配列間で共通する要素を見つけることができ、データのフィルタリングや分析に役立ちます。
array_intersectと型の扱い
array_intersect
関数は、PHPの柔軟な型付けの性質を反映しており、デフォルトではデータ型に厳密な比較を行いません。これにより、異なる型でも同じ「値」を持つ要素が共通部分として扱われることがあります。型が重要な場合には、特定の注意を払って処理を行う必要があります。
型のゆるやかな比較
デフォルトでは、array_intersect
はPHPの「ゆるやかな型比較」を採用しています。これは、データの型が異なっていても、値が同じであれば共通部分として認識されるということです。例えば、文字列と数値があった場合でも、同じ値であれば共通要素として扱われます。
以下はその一例です:
$array1 = [1, "2", 3];
$array2 = ["1", 2, 3];
$result = array_intersect($array1, $array2);
print_r($result); // [1, 3]
この例では、"1"
と 1
は異なる型ですが、PHPの型比較では同じ値と見なされ、共通部分として1
が抽出されます。しかし、"2"
と2
は異なる型であるため、共通部分として認識されません。
型を厳密に比較する場合
データの型が厳密に重要な場合は、array_intersect
の代わりに、array_intersect_assoc
やarray_intersect_key
といった、型を含めてより厳密に比較を行う関数を使うことが考えられますが、それでも「値の比較」がメインです。PHPには、厳密な型比較を行うための===
(厳密比較演算子)を内部的に使用する関数が用意されていないため、自前で実装することも一つの方法です。
例えば、次のようにして厳密な比較を実装することができます:
function strict_array_intersect($array1, $array2) {
return array_uintersect($array1, $array2, function($a, $b) {
return $a === $b ? 0 : ($a > $b ? 1 : -1);
});
}
$array1 = [1, "2", 3];
$array2 = ["1", 2, 3];
$result = strict_array_intersect($array1, $array2);
print_r($result); // [3]
この場合、===
演算子を用いて、値だけでなく型も厳密に比較しています。したがって、数値の1
と文字列の"1"
は異なるものとして扱われ、共通部分には含まれません。
型によるエラーを避けるためのベストプラクティス
array_intersect
を使用する際には、型に関する問題を未然に防ぐために、次のベストプラクティスを考慮すると良いでしょう。
- 型を揃える:入力する配列の要素が同じ型であることを確認する。例えば、すべての要素を整数や文字列にキャストする。
- 型の厳密なチェックが必要な場合:厳密な比較が必要な場合は、カスタム関数を用いるか、別の方法で処理を行う。
- 混在する型に注意:文字列と数値、浮動小数点数と整数など、異なる型が混在する場合の挙動に注意する。
型に基づく比較の動作を理解しておくことは、array_intersect
を使った配列操作を正しく行うために非常に重要です。
応用例:重複するデータのフィルタリング
array_intersect
は、単純な配列比較だけでなく、データの重複を取り除くためのフィルタリングにも応用できます。例えば、異なるデータセットから重複する要素を特定したり、同一データを削除したりする際に役立ちます。ここでは、具体的なシナリオを基に、array_intersect
を活用したデータの重複フィルタリングの方法を紹介します。
同一のデータをフィルタリングする例
まず、2つのリストから共通する要素、つまり重複するデータを抽出して、重複を取り除くケースを考えます。次の例では、2つの異なるユーザーリストを比較し、両方のリストに存在するユーザーを特定します。
$list1 = ['Alice', 'Bob', 'Charlie', 'David'];
$list2 = ['Eve', 'Bob', 'Charlie', 'Frank'];
$duplicate_users = array_intersect($list1, $list2);
print_r($duplicate_users); // ['Bob', 'Charlie']
この例では、両方のリストに含まれている「Bob」と「Charlie」が重複するユーザーとして抽出されています。このように、array_intersect
を使って複数のリストを比較し、共通するデータをフィルタリングできます。
データの一部に重複がある場合のフィルタリング
例えば、商品の購入履歴を持つ2つのデータセットから、過去に購入された商品を特定し、その商品をフィルタリングする場合にもarray_intersect
が役立ちます。
$purchases_2023 = ['Laptop', 'Smartphone', 'Tablet', 'Headphones'];
$purchases_2024 = ['Smartphone', 'Tablet', 'Smartwatch', 'Keyboard'];
$common_purchases = array_intersect($purchases_2023, $purchases_2024);
print_r($common_purchases); // ['Smartphone', 'Tablet']
この例では、2023年と2024年の両年に購入された共通のアイテム(Smartphone
とTablet
)が結果として出力されます。これにより、将来的な商品分析やマーケティングのために、再度購入された商品を特定することができます。
重複データの除外による新規データの抽出
次に、array_diff
を使って、重複データを除外し、新規のデータを抽出する方法も紹介します。たとえば、ある年に新しく購入された商品をリストから特定する場合です。
$purchases_2023 = ['Laptop', 'Smartphone', 'Tablet', 'Headphones'];
$purchases_2024 = ['Smartphone', 'Tablet', 'Smartwatch', 'Keyboard'];
$new_purchases_2024 = array_diff($purchases_2024, $purchases_2023);
print_r($new_purchases_2024); // ['Smartwatch', 'Keyboard']
この例では、2024年に新たに購入された商品(Smartwatch
とKeyboard
)が抽出されています。このように、共通部分の抽出と合わせて、新規データの抽出も容易に行うことができます。
実際のプロジェクトでの応用
例えば、Eコマースサイトやユーザー分析システムでは、異なる期間の購入履歴やアクセスログから共通するユーザーやアイテムを抽出することが頻繁にあります。また、重複した情報をフィルタリングし、新規データを効率的に抽出することで、マーケティング活動やプロダクト開発の意思決定を支援することが可能です。
このように、array_intersect
は重複データのフィルタリングや共通データの抽出に非常に有用で、データ分析や整理に欠かせないツールとなります。
array_intersectを使ったエラーハンドリング
array_intersect
は便利な配列比較関数ですが、使用する際には特定のエラーや問題を避けるために適切なエラーハンドリングを行うことが重要です。ここでは、よく発生する問題点とその対策方法を解説します。
未定義の配列を渡した場合の対処法
array_intersect
を使う際に、比較する配列が未定義だったり、空の配列が渡される場合があります。このような状況では、予期しない結果を引き起こす可能性があります。例えば、未定義の変数や空の配列が含まれていると、期待通りの結果が得られないため、事前にチェックを行う必要があります。
次のように、未定義の配列が渡された場合の対策を行います:
$array1 = [1, 2, 3];
$array2 = null; // 未定義またはnullの配列
// エラーチェック
if (is_array($array2)) {
$result = array_intersect($array1, $array2);
print_r($result);
} else {
echo "比較対象の配列が無効です。";
}
この例では、is_array()
を使って配列が定義されているかどうかを確認し、未定義の配列に対してエラーを防いでいます。
異なるデータ型による予期しない結果への対処
データ型が異なる要素を含む配列をarray_intersect
で比較した場合、PHPの緩やかな型比較により、意図しない結果を引き起こす可能性があります。例えば、文字列"1"
と整数1
は同じ値として扱われることがあります。このような場合には、事前にデータ型を明示的に統一するか、型を厳密にチェックすることが必要です。
次のように、型を揃える処理を追加することができます:
$array1 = [1, "2", 3];
$array2 = ["1", 2, 3];
// すべての要素を文字列に変換
$array1 = array_map('strval', $array1);
$array2 = array_map('strval', $array2);
$result = array_intersect($array1, $array2);
print_r($result); // ['1', '2', '3']
この例では、array_map()
を使って全ての要素を文字列に変換し、比較時に予期しない型の影響を排除しています。
大規模データの処理時に発生するパフォーマンス問題
array_intersect
は非常に便利ですが、大規模なデータセットを扱う場合には、パフォーマンスの問題が発生することがあります。配列の要素数が多くなると、処理時間が増加するため、効率的な処理が必要です。これを回避するためには、データを事前にフィルタリングしたり、比較対象の配列を縮小することが効果的です。
以下は、配列を事前にフィルタリングしてarray_intersect
のパフォーマンスを最適化する例です:
$array1 = range(1, 100000); // 1から10万までの数
$array2 = range(50000, 150000); // 5万から15万までの数
// 小規模な配列にフィルタリング
$filtered_array1 = array_filter($array1, function($value) {
return $value % 10 === 0; // 10で割り切れる値だけを抽出
});
$result = array_intersect($filtered_array1, $array2);
print_r($result);
この例では、array_filter
を使って比較する配列のサイズを縮小することで、全体的なパフォーマンスを向上させています。
無効な入力データに対する例外処理
場合によっては、ユーザー入力や外部から渡されるデータが無効であることがあります。この場合、適切なエラー処理や例外処理を行うことで、コードの信頼性を高めることができます。
try {
$array1 = [1, 2, 3];
$array2 = "invalid"; // 無効な入力
if (!is_array($array2)) {
throw new Exception("無効な入力です。配列を渡してください。");
}
$result = array_intersect($array1, $array2);
print_r($result);
} catch (Exception $e) {
echo $e->getMessage();
}
この例では、is_array()
によって配列であるかどうかを確認し、無効な入力があれば例外を発生させることで、適切なエラーメッセージを表示しています。
array_intersect
を使う際には、こうしたエラーハンドリングの工夫を取り入れることで、予期しない問題を避け、より信頼性の高いコードを実現することができます。
実行速度とパフォーマンスの最適化
array_intersect
関数は、配列同士の比較を行う際に非常に便利ですが、大規模なデータセットや複数の配列を扱う場合、処理時間やメモリ使用量に影響を与えることがあります。このセクションでは、array_intersect
のパフォーマンスに関する注意点と、処理を最適化するための方法について解説します。
要素数が多い配列の処理
配列の要素数が増えると、array_intersect
の計算量が増加し、処理時間が長くなります。array_intersect
は、比較対象の配列内で共通する要素を検索するため、要素数に比例して時間がかかります。例えば、2つの大規模な配列を比較する場合、両方の配列に含まれる要素の数が多ければ多いほど、パフォーマンスに影響を与える可能性があります。
$array1 = range(1, 100000); // 1から10万までの要素を持つ配列
$array2 = range(50000, 150000); // 5万から15万までの要素を持つ配列
$result = array_intersect($array1, $array2);
print_r($result); // 共通する要素のリストが表示される
この例では、比較対象の配列が大きいため、array_intersect
の処理に時間がかかる可能性があります。要素数が膨大になる場合は、事前に最適化を行うことが重要です。
パフォーマンスの最適化方法
大規模な配列を処理する際に、array_intersect
のパフォーマンスを最適化するための方法をいくつか紹介します。
1. 不要なデータのフィルタリング
まず、配列を比較する前に、不要な要素を事前にフィルタリングすることで、比較対象の要素数を減らすことができます。例えば、ある条件に基づいて、比較が不要なデータを排除することで、処理の負荷を軽減できます。
$array1 = range(1, 100000);
$array2 = range(50000, 150000);
// 10で割り切れる要素だけを残す
$array1 = array_filter($array1, function($value) {
return $value % 10 === 0;
});
$result = array_intersect($array1, $array2);
print_r($result);
この例では、array_filter
を使用して、10で割り切れる要素だけを残すことで、array_intersect
の比較対象を減らし、パフォーマンスを改善しています。
2. ハッシュテーブルを利用した配列の最適化
PHPの配列は内部的にハッシュテーブルとして管理されているため、キーや要素の検索が高速に行われます。特定の条件で配列の要素をキーに変換することで、array_intersect
を使わずに直接的に比較を行うことも可能です。これにより、処理時間が大幅に短縮される場合があります。
例えば、次のように配列の要素をキーとして扱うことで、より効率的な比較が可能です。
$array1 = array_flip([1, 2, 3, 4, 5]);
$array2 = array_flip([3, 4, 5, 6, 7]);
$result = array_intersect_key($array1, $array2);
print_r(array_keys($result)); // [3, 4, 5]
この例では、array_flip
を使って配列の要素をキーに変換し、array_intersect_key
を使用してキーに基づく比較を行っています。こうすることで、通常のarray_intersect
に比べて効率的に共通要素を取得できます。
3. データのソートによるパフォーマンス向上
配列があらかじめソートされている場合、データの順序を利用して効率的な比較を行うことができます。特に、ソートされた配列であれば、バイナリサーチのようなアルゴリズムを適用して高速化が可能です。PHPの標準関数であるarray_intersect
はソートされていないデータにも対応できますが、ソートされた配列同士の比較を行う場合、独自のアルゴリズムで最適化を行うことができます。
$array1 = [1, 2, 3, 4, 5];
$array2 = [3, 4, 5, 6, 7];
// 両方の配列がソートされているため、効率的に比較可能
$result = array_intersect($array1, $array2);
print_r($result); // [3, 4, 5]
このように、配列が事前にソートされている場合、比較がより効率的に行えます。
4. メモリ使用量を減らす
大規模な配列を処理する際、メモリ使用量にも注意が必要です。大量のデータを保持している配列を操作すると、メモリ不足やスクリプトの実行時間オーバーが発生することがあります。メモリ使用量を減らすために、特定の範囲のデータのみを処理する、または部分的に比較を行うことで、リソースの節約が可能です。
ini_set('memory_limit', '256M'); // メモリ制限の設定
set_time_limit(60); // スクリプトの実行時間制限を設定
これらの設定を使用することで、大規模な配列処理が必要な場合に、メモリと時間の制限を適切に管理できます。
まとめ
array_intersect
は便利で柔軟な関数ですが、大規模データを扱う際にはパフォーマンスへの影響に注意が必要です。不要なデータのフィルタリング、効率的なデータ構造の活用、ソートによる最適化などを取り入れることで、より高速かつ効率的な配列比較が可能になります。
他の関数との比較:array_diffとの違い
PHPには、配列を操作するためのさまざまな関数がありますが、その中でもarray_intersect
とよく比較される関数にarray_diff
があります。これらの関数はどちらも配列を比較して特定の要素を抽出しますが、その機能は異なります。このセクションでは、array_intersect
とarray_diff
の違いについて詳しく解説し、使い分けのポイントを紹介します。
array_intersectの動作
array_intersect
は、複数の配列の中で「共通する要素」を抽出するための関数です。比較する配列に含まれているすべての共通要素を返します。
$array1 = [1, 2, 3, 4, 5];
$array2 = [3, 4, 5, 6, 7];
$result = array_intersect($array1, $array2);
print_r($result); // [3, 4, 5]
この例では、$array1
と$array2
の両方に存在する共通の要素3
, 4
, 5
が結果として返されます。
array_diffの動作
一方、array_diff
は「差分」を取得するための関数です。指定した配列同士を比較し、最初の配列にのみ含まれている要素を返します。つまり、比較対象の他の配列に存在しない要素を抽出します。
$array1 = [1, 2, 3, 4, 5];
$array2 = [3, 4, 5, 6, 7];
$result = array_diff($array1, $array2);
print_r($result); // [1, 2]
この例では、$array1
に存在するが、$array2
には存在しない要素である1
, 2
が結果として返されます。array_diff
は、共通部分を除いた要素のみを返すため、配列の違いを強調するのに役立ちます。
array_intersectとarray_diffの使い分け
array_intersect
とarray_diff
は、どちらも配列を比較する際に使用されますが、それぞれの用途は異なります。主に以下のような状況で使い分けます。
1. 共通部分を見つけたい場合:array_intersect
複数の配列に共通して存在する要素を取得したい場合には、array_intersect
を使用します。たとえば、共通するユーザー、アイテム、データを特定したい場合に便利です。
例:全てのリストに共通して存在する商品を見つける場合
$store1 = ['apple', 'banana', 'orange'];
$store2 = ['banana', 'orange', 'grape'];
$store3 = ['orange', 'banana', 'pineapple'];
$result = array_intersect($store1, $store2, $store3);
print_r($result); // ['banana', 'orange']
2. 差分を見つけたい場合:array_diff
逆に、ある配列にしか存在しない要素や、他の配列に含まれていないユニークな要素を見つけたい場合には、array_diff
を使用します。データの追加や削除を追跡する際に便利です。
例:新しく追加されたアイテムを見つける場合
$oldList = ['apple', 'banana', 'orange'];
$newList = ['apple', 'banana', 'orange', 'grape', 'kiwi'];
$newItems = array_diff($newList, $oldList);
print_r($newItems); // ['grape', 'kiwi']
キーの扱いの違い
array_intersect
とarray_diff
の両方とも、デフォルトでは値のみを比較し、キーは無視します。しかし、キーも含めて比較したい場合は、array_intersect_assoc
やarray_diff_assoc
を使用することができます。これらの関数は、値とキーの両方を比較し、共通部分または差分を返します。
$array1 = ['a' => 1, 'b' => 2, 'c' => 3];
$array2 = ['a' => 1, 'b' => 3, 'c' => 3];
$result = array_diff_assoc($array1, $array2);
print_r($result); // ['b' => 2]
この例では、キーと値の両方が異なる要素(b => 2
)のみが差分として返されます。
まとめ
array_intersect
とarray_diff
は、どちらも配列を比較して特定の要素を抽出するために使いますが、目的が異なります。共通部分を見つけたい場合はarray_intersect
、差分を見つけたい場合はarray_diff
を使い分けると良いでしょう。また、キーの比較も必要な場合には、assoc
バージョンの関数を利用することで、より厳密な配列比較が可能です。これらの関数を理解し、適切に使い分けることで、配列操作をより効率的に行うことができます。
演習問題:実践的な配列操作の課題
array_intersect
とarray_diff
の理解を深めるために、いくつかの実践的な演習問題に取り組んでみましょう。これらの課題を通じて、配列操作の基本と応用を確認することができます。
問題1: 共通する商品の抽出
次の2つの配列は、異なる店舗で販売されている商品のリストです。両方の店舗で販売されている共通の商品をarray_intersect
を使って取得してください。
$store1 = ['apple', 'banana', 'cherry', 'date'];
$store2 = ['banana', 'cherry', 'fig', 'grape'];
$result = array_intersect($store1, $store2);
print_r($result);
期待される結果:
共通の商品「banana」と「cherry」が結果として出力されます。
問題2: 新規追加された商品の特定
次の2つの配列は、ある店舗の過去と現在の在庫商品リストです。現在のリストに追加された新しい商品をarray_diff
を使って取得してください。
$oldInventory = ['laptop', 'mouse', 'keyboard'];
$newInventory = ['laptop', 'mouse', 'keyboard', 'monitor', 'printer'];
$result = array_diff($newInventory, $oldInventory);
print_r($result);
期待される結果:
新しく追加された商品「monitor」と「printer」が結果として出力されます。
問題3: ユーザーリストの比較
次の配列は、あるウェブサイトの過去1ヶ月間と現在のアクティブユーザーリストです。過去1ヶ月に活動していたが、現在活動していないユーザーをarray_diff
を使って取得してください。
$previousUsers = ['Alice', 'Bob', 'Charlie', 'David'];
$currentUsers = ['Alice', 'Charlie', 'Eve'];
$result = array_diff($previousUsers, $currentUsers);
print_r($result);
期待される結果:
過去に活動していたが現在活動していないユーザー「Bob」と「David」が結果として出力されます。
問題4: キーと値を比較する商品リスト
次の配列は、異なる店舗で販売されている商品とその価格のリストです。キー(商品名)と値(価格)が同じ商品のリストをarray_intersect_assoc
を使って取得してください。
$store1 = ['apple' => 1.2, 'banana' => 0.5, 'cherry' => 2.0];
$store2 = ['apple' => 1.2, 'banana' => 0.6, 'cherry' => 2.0];
$result = array_intersect_assoc($store1, $store2);
print_r($result);
期待される結果:
商品名と価格が一致する「apple」と「cherry」が結果として出力されます。
問題5: 複数の配列から共通する値の抽出
次の3つの配列は、異なるカテゴリに分類されたアイテムのリストです。すべてのカテゴリに共通して存在するアイテムをarray_intersect
を使って取得してください。
$category1 = ['pen', 'pencil', 'eraser'];
$category2 = ['pencil', 'eraser', 'notebook'];
$category3 = ['pencil', 'eraser', 'marker'];
$result = array_intersect($category1, $category2, $category3);
print_r($result);
期待される結果:
すべてのカテゴリに共通するアイテム「pencil」と「eraser」が結果として出力されます。
これらの演習問題を解くことで、配列操作の基本的なスキルを強化できます。実際に手を動かして試してみてください。
まとめ
この記事では、PHPのarray_intersect
関数を中心に、配列の共通部分を抽出する方法について学びました。また、array_diff
との違い、複数の配列を比較する際の効率的な方法やエラーハンドリング、パフォーマンス最適化のポイントも解説しました。これらの関数を使いこなすことで、配列操作がより効率的に行えるようになります。配列の共通部分や差分を効果的に抽出し、実際のプロジェクトで活用してみてください。
コメント