必要だったので自作。
例えば以下のような配列があったとする。
$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"
}
}
元配列のキーは保持され、重複したレコードがある場合はその中で一番最初にヒットしたもがセットされる。
関数を呼び出す際に存在しないキー名が渡された場合、元配列をそのまま返却するようにしてみた。