【PHP】配列で二つの値が共に重複しない新規配列を返す関数。

必要だったので自作。

例えば以下のような配列があったとする。

$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"
  }
}

元配列のキーは保持され、重複したレコードがある場合はその中で一番最初にヒットしたもがセットされる。
関数を呼び出す際に存在しないキー名が渡された場合、元配列をそのまま返却するようにしてみた。