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