PHPの配列で重複する値があった場合にその要素を削除する方法を紹介します。
キーの重複はPHPに限らず配列ではありえません。
しかし、値は自由なので重複する可能性があります。
仕様的にそれを削除して扱いたい場合もあると思います。
そんなとき便利なのが array_unique() という関数です。
これはまさに値の重複をすべて削除してくれるというものです。
では実際に使ってみましょう。
PHPの配列から値が重複する要素を削除するarray_unique関数を使ってみる
[aside type=”normal”]array_unique($配列, [ソートの挙動])[/aside]
$配列は、値の重複を削除する対象の配列です。
戻り値には重複を削除した配列が返ってきます。
第2引数のソートの挙動は使ったことが無いのですが、文字列比較や数値比較など型ありの比較ができるみたいです。
実際に重複を削除してみます。
$ary = array("東京", "大阪", "大阪", "東京", "北海道", "大阪", "沖縄", "北海道");
$result = array_unique($ary);
var_dump($result);
結果は次のようになります。
array(4) {
[0]=>
string(6) "東京"
[1]=>
string(6) "大阪"
[4]=>
string(9) "北海道"
[6]=>
string(6) "沖縄"
}
重複が削除された配列ができました!
削除された要素のインデックスはそのまま抜けてしまうようです。
値の型だけが違う場合は?
例えば数値型の4と文字列の”4″は重複しちゃうの??って話です。
僕は重複で削除しちゃおうよって思いますけど実際に動かすとどうでしょうか。
$ary = array("あいうえお", 4, 2, 0, "4", 4, "2", false);
$result = array_unique($ary);
var_dump($result);
文字列とか真偽とかちょっと混ぜてみました。
結果は次の通りです。
array(5) {
[0]=>
string(15) "あいうえお"
[1]=>
int(4)
[2]=>
int(2)
[3]=>
int(0)
[7]=>
bool(false)
}
数値型の4と文字列の”4″は重複として削除されるようですね。
0 と false も重複になるのかな?って思いましたがこれはならないようです。
インデックスのずれはarray_valuesで整理
array_unique()を使って配列の重複を削除すると、インデックスが削除された要素のものだけ抜けてしまいます。
これを詰めて整理するためには array_values() が便利です。
下の記事の中で説明してますので参考にどうぞ。
≫ PHPの配列の特定要素を削除するunset()を使う場合の注意点
使い方は引数に配列を渡すだけです。
戻り値に整理された配列が返ってきます。
多次元配列の場合はどうなる?
多次元配列の場合はどうでしょう?
例えばAくん、Bくん、Cくん、Dくんがそれぞれ行きたい都道府県を挙げて、その都道府県を全て重複無く表示したいとします。
$ary = array(
"A" => array("東京", "埼玉"),
"B" => array("大阪", "京都", "東京"),
"C" => array("北海道"),
"D" => array("沖縄", "鹿児島", "大阪")
);
$result = array_unique($ary);
var_dump($result);
結果は、エラーになってしまいます。
Notice: Array to string conversion in ・・・
array_unique()は多次元配列を想定して作っていないようです。
ちなみに今回の場合の「行きたい場所」を全て重複無く取得するには次のように書けます。
// A~Dくんの行きたい場所を定義
$ary = array(
"A" => array("東京", "埼玉"),
"B" => array("大阪", "京都", "東京"),
"C" => array("北海道"),
"D" => array("沖縄", "鹿児島", "大阪")
);
// A~Dくんの行きたい場所を1つの配列に格納
$newary = array();
foreach ($ary as $v) {
$newary = array_merge($newary, $v);
}
// 重複削除
$result = array_unique($newary);
// インデックス整理
$result = array_values($result);
var_dump($result);
結局1次元配列にしてから操作する感じですね。
結果は次のようになります。
array(7) {
[0]=>
string(6) "東京"
[1]=>
string(6) "埼玉"
[2]=>
string(6) "大阪"
[3]=>
string(6) "京都"
[4]=>
string(9) "北海道"
[5]=>
string(6) "沖縄"
[6]=>
string(9) "鹿児島"
}
まとめ
配列の値の重複を削除したい場合はarray_unique()を使う。
例えば数値の4と文字列の”4″は同じ値として削除される。
キーがインデックスだった場合、削除された要素の番号が抜けてしまう。
その場合は、array_values()を使ってインデックスを整理する。
多次元配列には対応していない。










コメント