PHPでは、配列を使用してさまざまな処理が可能です。
この記事では、
・重複した値をカウントする方法
という基本的な内容から、
・重複した要素のみを抽出する方法
・重複しない要素のみを抽出する方法
などの応用的な使い方に関しても解説していきます。
今回はそんな配列の重複処理について、わかりやすく解説します!
重複した値をカウントする
array_count_values関数を使用する
array_count_values関数は、指定した配列の値と、配列の中での使用回数をカウントします。
戻り値は、連想配列のキーと、設定している要素の回数を合わせた連想配列を返します。
array_count_values ( $配列名 )
array_count_values関数を使用した、重複した値をカウントする方法を以下に記述します。
<?php $fruits = [0=>'apple', 1=>'orange', 2=>'apple', 3=>'orange', 4=>'banana']; //array_count_valuesを使用して値の使用回数をカウントする $fruits_count = array_count_values($fruits); foreach($fruits_count as $key => $value){ echo 'key : '.$key; echo '<br>'; echo ' value : '.$value; echo '<br>'; } ?>
実行結果 key : apple value : 2 key : orange value : 2 key : banana value : 1
重複した要素のみを抽出する
ここでは、重複した要素のみを取得する方法として、array_intersect関数を使用する方法とループで比較して抽出する方法の2パターンを紹介します。
array_intersect関数を使用する
array_intersect関数は、$配列1と全ての引数に存在する値を抽出した配列で返します。
array_intersect($配列1, $配列2 [, $配列3 …]);
array_intersect関数を使用して、重複した要素のみを抽出する方法を以下に記述します。
<?php $fruits1 = ['apple', 'orange', 'melon']; $fruits2 = ['orange', 'pineapple', 'apple']; $fruits_merge = array_intersect($fruits1, $fruits2); foreach($fruits_merge as $value){ echo $value; echo '<br>'; } ?>
実行結果 apple orange
ループを使用して比較する
比較する配列1と配列2で重複した値を、array_intersect関数を使用せずに抽出する場合は、以下のようにループを使用します。
<?php $fruits1 = ['apple', 'orange', 'melon']; $fruits2 = ['orange', 'pineapple', 'apple']; foreach($fruits1 as $value1){ foreach($fruits2 as $value2){ // 配列の値を順番に比較する if ($value1 == $value2){ $fruits_merge[] = $value1; } } } foreach($fruits_merge as $value){ echo $value; echo '<br>'; } ?>
実行結果 apple orange
サンプルでは配列$fruits1と$fruits2をそれぞれループで回して値を順番に比較していき、重複した値が存在した場合は配列$fruits_mergeに随時格納しています。
array_intersect関数を使用したほうが処理が少なくて済みますが、抽出はしたいけど特定の要素のみは除外したい場合などは、紹介したループ処理を使用すると便利です。
なお、比較対象の配列の差分のみを取得する場合にはarray_diff関数を使用します。
array_diff関数については、以下の記事で詳しく解説しています。
重複したキーのみを抽出する
連想配列で重複しているキーのみを取得する場合は、以下のように記述します。
<?php $fruits1 = [0=>'apple', 1=>'orange', 2=>'melon', 3=>'banana', 4=>'pineapple']; $fruits2 = [5=>'apple', 6=>'orange', 7=>'melon', 1=>'banana', 2=>'pineapple']; foreach($fruits1 as $key1 => $value1){ foreach($fruits2 as $key2 => $value2){ // 連想配列のキーを順番に比較する if ($key1 == $key2){ $fruits_merge[] = $key1; } } } foreach($fruits_merge as $value){ echo $value; echo '<br>'; } ?>
1 2
重複した要素のみを抽出するときのサンプルと同様に、ループで回してキーを順番に比較していき、重複しているキーが存在した場合は配列$fruits_mergeに随時格納しています。
連想配列をforeachでループするときは、1次元配列と書き方が異なるので注意しましょう。
配列をループで回す処理は、以下の記事で詳しく解説しています。
重複しない要素のみを抽出する
重複しない要素のみを抽出する場合は、重複した値のみを削除して差分を取得するarray_diff関数を使用します。
array_diff関数については、以下の記事で詳しく解説しています。
まとめ
ここでは、重複した値をカウントしたり、取得する方法などについて解説しました。
配列を扱った処理は、実際の開発でもよく使用しますので、この機会にぜひ覚えておきましょう。
もし、配列の重複処理を忘れてしまったら、この記事を思い出してくださいね!