連想配列 重複 削除

発端はDBから取得したデータのうち、日付やidが重複する不要なデータがあったので、それをどうにかしたいと思ったこと。

配列の値重複削除は、array_unique()

まず単純に配列で、重複する値を削除する場合にはarray_unique()を使う。
以下、コード。var_dump()した結果を見ると、重複したレコードは削除されていることが、keyをみれば分かる。この後で、データを整形していくのであれば、array_values()であったり、array_filter()だったりを使っていくと思うので、どのような処理をするかによって組み合わせる。

<?php
// Your code here!
$array = array('isekai1', 'isekai2', 'isekai1', 'isekai', 'isekai2', 'isekai');

$unique = array_unique($array);

var_dump($unique);
?>

//var_dump()の結果
array(3) {
  [0]=>
  string(7) "isekai1"
  [1]=>
  string(7) "isekai2"
  [3]=>
  string(6) "isekai"
}

連想配列の重複削除 (特定のレコードだけ)

配列については分かったが、連想配列の場合にはどうすれば良いのか。
特定のレコードで重複しているものだけを削除したい場合には、以下の方法を試してみた。よく使うと書いてあるように、確かにこれまで何回か使っているので、覚えておきたい。

連想配列中の重複したレコードを削除する(最終閲覧2020/05/30)

このQiitaの記事に、以下のようなコードがある。

$tmp = [];
$uniqueStations = [];
foreach ($stations as $station){
   if (!in_array($station['name'], $tmp)) {
      $tmp[] = $station['name'];
      $uniqueStations[] = $station;
   }
}

まず、$tmpに配列をセットする。$stationsという配列をforeachで回し、$tmpに$station['name’]が重複していなければ、$tmpにnameを、$uniqueStationsには重複していない配列を入れていく、という感じだ。

実際に、$uniqueStationsをvar_dump()して、処理前と比べてみると、重複しているものが無くなっていることがわかるだろう。

連想配列の重複削除 (すべてのレコード)

特定のものだけなら、そうすれば良いが、すべての値が重複している場合にはどうすればいいのか。すべての場合には、下記のようにコードを書き換えてやれば良い。

$uniqueStations = [];
foreach ($stations as $station){
   if (!in_array($station, $uniqueStations )) {
      $uniqueStations[] = $station;
   }
}

全てのレコードを見て、同じ配列が含まれていないなら、$uniqueStationsに入れてやるという処理をforeachで回す。

これで、連想配列で「特定の値」と「すべて」の場合とで重複するものを削除することができた。

basic, php

Posted by himajinn