PHPで配列同士を比較し、重複していない要素を取得する方法と、逆に重複している共通項のみを取得する方法をご紹介します。
「値」、「キー」、「値とキー」の3タイプを比較します。
配列の差分を取得する
まずは、配列の重複した要素を除外してみましょう。
array_diff関数で値を比較
配列の差を計算してくれます。
1 2 3 4 5 6 7 8 |
// 比較元の配列を変数に格納 $val = array('sano', 'aoyama', 'momozono'); // 比較対象の配列を変数に格納 $val2 = array('izumi', 'koyama', 'sano'); // 配列を比較して重複しない値のみ出力 print_r(array_diff($val, $val2)); |
Array ( [1] => aoyama [2] => momozono )
1つ目の比較元の配列と2つ目の比較対象の配列を比較して、重複していない値のみが出力されました。
array_diff関数の構文
array_diff ( 比較元の配列 , 比較対象の配列1 [, 比較対象の配列2 …] );
array_diff()
は上記のように、比較したい配列をカンマ区切りで並べていきます。
比較元の配列を比較対象の配列と比較し、比較元の配列にしかない値のみを取得します。
比較対象の配列にしかない値は関係ないので、無視されます。
配列の比較
先ほどのサンプルでは以下のように比較されました。
比較元の配列 => (‘sano‘, ‘aoyama‘, ‘momozono‘);
比較対象の配列 => (‘izumi’, ‘koyama’, ‘sano‘);
比較元の配列の赤文字が今回取得される重複していない値で、グレー文字が重複した値です。
sano
が重複しているため、除外されていますね。
array_diff_key関数でキーを比較
配列のキーを基準に差分を比較してくれます。
1 2 3 4 5 6 7 8 |
// 比較元の配列を変数に格納 $key = array('a'=>'sano', 'd'=>'aoyama', 'e'=>'momozono'); // 比較対象の配列を変数に格納 $key2 = array('a'=>'izumi', 'e'=>'aoyama', 'f'=>'sano'); // 配列のキーを比較して重複しないキーと値を出力 print_r(array_diff_key($key, $key2)); |
Array ( [d] => aoyama )
キーが重複していない比較元の配列のキーと値が出力されました。
array_diff_key関数の構文
array_diff_key ( 比較元の配列, 比較対象の配列1 [, 比較元の配列2 … ] );
array_diff()
と似た構文になっていますが、値ではなくキーを比較
しています。
比較元の配列を比較対象の配列と比較し、比較元の配列にしかないキーのみを取得します。
配列の比較
先ほどのサンプルでは以下のように比較されました。
比較元の配列 => (‘a‘=>’sano’, ‘d‘=>’aoyama‘, ‘e‘=>’momozono’);
比較対象の配列 => (‘a‘=>’izumi’, ‘e‘=>’aoyama’, ‘f’=>’sano’);
比較元の配列の赤文字が今回取得される重複していないキーで、グレー文字が重複したキーです。
a
とe
が重複しているため除外され、値は重複しているもののキーが重複していない'd'=>'aoyama'
が取得されましたね。
array_diff_assoc関数で「キー => 値」のペアで比較
配列の「キー => 値」のペアで比較してくれます。
1 2 3 4 5 6 7 8 |
// 比較元の配列を変数に格納 $arr = array('b'=>'sano', 'd'=>'aoyama', 'momozono'); // 比較対象の配列を変数に格納 $arr2 = array('a'=>'izumi', 'd'=>'aoyama', 'sano', 'momozono'); // 「キー => 値」のペアで比較して重複していない要素のみ出力 print_r(array_diff_assoc($arr, $arr2)); |
Array ( [b] => sano [0] => momozono )
「キー => 値」のペアで比較し、重複していない要素のみが出力されました。
array_diff_assoc関数の構文
array_diff_assoc ( 比較元の配列 , 比較対象の配列1 [ , 比較元の配列2 … ] );
array_diff()
との違いは、値だけでなく、「キー => 値」のペアで比較します。
比較元の配列を比較対象の配列と比較し、比較元の配列にしかない「キー => 値」のペアのみを取得します。
配列の比較
先ほどのサンプルでは以下のように比較されました。
比較元の配列 => (‘b‘=>’sano‘, ‘d‘=>’aoyama‘, ‘momozono‘);
比較対象の配列 => (‘a’=>’izumi’, ‘d‘=>’aoyama‘, ‘sano’, ‘momozono’);
比較元の配列の赤文字が今回取得される重複していない要素で、グレー文字が重複した要素です。
'd'=>'aoyama'
が重複しているため除外され、値は重複しているもののキーが重複していない'b'=>'sano'
と'momozono'
が取得されましたね。
‘momozono’は重複してるのでは?
先ほどの配列の比較を見ると'momozono'
は重複しているように見えますが、実は重複していません。
それぞれの配列を出力してみると分かるでしょう。
上段:比較元の配列
下段:比較対象の配列
Array ( [b] => sano [d] => aoyama [0] => momozono )
Array ( [a] => izumi [d] => aoyama [0] => sano [1] => momozono )
'momozono'
を見てみると、以下のようになっています。
- 上段 →
[0] => momozono
- 下段 →
[1] => momozono
それぞれキーが違うのが分かるかと思います。
キーと値がペアで重複して初めて除外されるので、このような結果になりました。
配列の共通項を取得する
次は、配列が重複した要素だけを取得してみましょう。
array_intersect関数で値を比較
配列の共通項を取得してくれます。
1 2 3 4 5 6 7 8 |
// 比較元の配列を変数に格納 $val = array('sano', 'aoyama', 'momozono'); // 比較対象の配列を変数に格納 $val2 = array('izumi', 'koyama', 'sano'); // 配列を比較して重複した要素だけを取得 print_r(array_intersect($val, $val2)); |
Array ( [0] => sano )
今度は重複した値だけを取得してくれました。
array_intersect関数の構文
array_intersect ( 比較元の配列 , 比較対象の配列1 [ , 比較対象の配列2 … ] );
比較元の配列を比較対象の配列と比較し、比較元の配列と比較対象の配列の全てに存在している値のみを取得します。
array_intersect_key関数でキーを比較
キーを基準に配列の共通項を取得してくれます。
1 2 3 4 5 6 7 8 |
// 比較元の配列を変数に格納 $key = array('a'=>'sano', 'd'=>'aoyama', 'e'=>'momozono'); // 比較対象の配列を変数に格納 $key2 = array('a'=>'izumi', 'e'=>'aoyama', 'f'=>'sano'); // 配列を比較して重複したキーだけを取得 print_r(array_intersect_key($key, $key2)); |
Array ( [a] => sano [e] => momozono )
キーが重複している[a]
と[e]
だけが取得できました。
値は重複していませんが、それはキーだけしかチェックしていないためです。
array_intersect_key関数の構文
array_intersect_key ( 比較元の配列 , 比較対象の配列1 [ , 比較対象の配列2 … ] );
比較元の配列を比較対象の配列と比較し、比較元の配列と比較対象の配列の全てに存在しているキーと、それに関連した値のみを取得します。
array_intersect_assoc関数で「キー => 値」のペアで比較
配列の「キー => 値」のペアで共通項を取得してくれます。
1 2 3 4 5 6 7 8 |
// 比較元の配列を変数に格納 $arr = array('b'=>'sano', 'd'=>'aoyama', 'momozono'); // 比較対象の配列を変数に格納 $arr2 = array('a'=>'izumi', 'd'=>'aoyama', 'sano', 'momozono'); // 配列を比較して「キー => 値」のペアで重複している要素を取得 print_r(array_intersect_assoc($arr, $arr2)); |
Array ( [d] => aoyama )
「キー => 値」のペアで比較し、重複した要素のみが出力されました。
'momozono'
も重複しているっぽいですが、実は重複していないのは、先ほど説明したとおりです。
先ほどの説明はこちら
‘momozono’は重複してるのでは?の項をご参照ください。
array_intersect_assoc関数の構文
array_intersect_assoc ( 比較元の配列 , 比較対象の配列1 [ , 比較元の配列2 … ] );
array_diff()
との違いは、値だけでなく、「キー => 値」のペアで比較します。
比較元の配列を比較対象の配列と比較し、比較元の配列と比較対象の配列の全てに存在している「キー => 値」のペアのみを取得します。
超わかりやすい!!!
コメント頂きありがとうございます。今後とも分かりやすい記事を作成してまいります。