連想配列 重複 削除
発端は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);
/*
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で回す。
これで、連想配列で「特定の値」と「すべて」の場合とで重複するものを削除することができた。