PHPで配列をマージして重複する要素を消す方法

こんにちは、さるまりんです。

タイトルの通りなのですが、開発していて複数の配列をマージ、マージされた配列から重複する要素を消す必要があったので、その方法をメモしておきます。

こんな配列があるとします。

$ary1 = ['Osaka', 'Kobe', 'Okayama', 'Hiroshima', 'Hakata'];
$ary2 = ['Tokyo', 'Yokohama', 'Hamamatsu', 'Nagoya', 'Kyoto', 'Osaka'];

これら二つをまずはマージします。

配列のマージには関数array_merge()を使います。

この関数は複数の配列を一つにまとめてくれます。

$result = array_merge($ary1, $ary2);

この関数が取るのは二つの配列と限定されているわけではなく複数です。
例えばさらに$ary3があったらそのままそれも渡せます。
こんな感じです。

$result = array_merge($ary1, $ary2, $ary3);

これで中身はこんな感じです。print_r()で表示してみました。

Array
(
    [0] => Osaka
    [1] => Kobe
    [2] => Okayama
    [3] => Hiroshima
    [4] => Hakata
    [5] => Tokyo
    [6] => Yokohama
    [7] => Hamamatsu
    [8] => Nagoya
    [9] => Kyoto
    [10] => Osaka
)

0番目と10番目に'Osaka'がありますね。
これを一つにしたいです。
関数array_unique()を使います。

この関数で重複する要素があると削除してくれます。

$result = array_unique($result);

array_unique()をかけた後にprint_r()してみました。

Array
(
    [0] => Osaka
    [1] => Kobe
    [2] => Okayama
    [3] => Hiroshima
    [4] => Hakata
    [5] => Tokyo
    [6] => Yokohama
    [7] => Hamamatsu
    [8] => Nagoya
    [9] => Kyoto
)

'Osaka'が重複していないですね。

$ary1$ary2、渡す順序を逆にするとどうでしょうか?

$result = array_merge($ary2, $ary1);
$result = array_unique($result);

結果をprint_r()するとこんな感じになります。

Array
(
    [0] => Tokyo
    [1] => Yokohama
    [2] => Hamamatsu
    [3] => Nagoya
    [4] => Kyoto
    [5] => Osaka
    [7] => Kobe
    [8] => Okayama
    [9] => Hiroshima
    [10] => Hakata
)

[6]の要素がないですね。インデックスはそのまま削除されているようなのでこれを詰めたいと思います。

インデックスを振り直すには関数array_values()を使います。

$result = array_values($result);

結果をprint_r()すると↓です。

Array
(
    [0] => Tokyo
    [1] => Yokohama
    [2] => Hamamatsu
    [3] => Nagoya
    [4] => Kyoto
    [5] => Osaka
    [6] => Kobe
    [7] => Okayama
    [8] => Hiroshima
    [9] => Hakata
)

array_mergearray_uniquearray_values、さらに順序が気になる場合は、sortをかけます。
単純にいくつかの関数を呼び出すだけなのですが忘れてしまっていることがあって。。

繰り返すことが勉強になるかな。
自分のものになるように頑張ります。

読んでくださってありがとうございました。

それではまた!