必要だったので自作。
例えば以下のような配列があったとする。
$array = array(
0 => array(
'name' => 'tarou',
'age' => '17',
),
1 => array(
'name' => 'tarou',
'age' => '19',
),
2 => array(
'name' => 'tarou',
'age' => '17',
),
3 => array(
'name' => 'hanako',
'age' => '15',
),
4 => array(
'name' => 'alice',
'age' => '20',
),
5 => array(
'name' => 'bob',
'age' => '17',
),
6 => array(
'name' => 'alice',
'age' => '20',
),
7 => array(
'name' => 'bob',
'age' => '17',
),
8 => array(
'name' => 'tarou',
'age' => '19',
),
);
ここで配列中のnameとageが共に重複するレコードのみ取り除きたい。
というわけで下記関数を用意。
function array_pair_unique($array, $one, $two) {
$first = reset($array);
if(!array_key_exists($one, $first) || !array_key_exists($two, $first) ) {
return $array;
}
$tmp = array();
$return = array();
foreach($array as $k => $v) {
if(array_key_exists($v[$one], $tmp) && in_array($v[$two], $tmp[$v[$one]])) {
continue;
} else {
$tmp[$v[$one]][] = $v[$two];
$return[$k] = $v;
}
}
return $return;
}
上記関数を以下のようにして用いる。
$array = array_pair_unique($array, 'name', 'age');
すると下記のような結果が返る。見事に思惑通り。
array(5) {
[0]=>
array(2) {
["name"]=>
string(5) "tarou"
["age"]=>
string(2) "17"
}
[1]=>
array(2) {
["name"]=>
string(5) "tarou"
["age"]=>
string(2) "19"
}
[3]=>
array(2) {
["name"]=>
string(6) "hanako"
["age"]=>
string(2) "15"
}
[4]=>
array(2) {
["name"]=>
string(5) "alice"
["age"]=>
string(2) "20"
}
[5]=>
array(2) {
["name"]=>
string(3) "bob"
["age"]=>
string(2) "17"
}
}
元配列のキーは保持され、重複したレコードがある場合はその中で一番最初にヒットしたもがセットされる。
関数を呼び出す際に存在しないキー名が渡された場合、元配列をそのまま返却するようにしてみた。