【PHP入門】配列の重複処理まとめ

こんにちは!フリーエンジニアのヤマシタです。

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関数については、以下の記事で詳しく解説しています。

まとめ

ここでは、重複した値をカウントしたり、取得する方法などについて解説しました。

配列を扱った処理は、実際の開発でもよく使用しますので、この機会にぜひ覚えておきましょう。

もし、配列の重複処理を忘れてしまったら、この記事を思い出してくださいね!

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部として、これまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。プログラミング初学者に向けてわかりやすく、ためになるコンテンツ作りを心がけています。

おすすめコンテンツ

まずはここから!初心者でも1から学べるプログラミング入門カリキュラム

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー