PHPに惚れました

今でも多分惚れてます。

PHP 配列内の値を重複チェック

PHPには配列の値の重複をチェックする関数が無いんですね。
重複を扱う関数はarray_uniqueがあるけどチェックじゃなくて削除してしまう。

重複しているモノだけを残し重複していないものは削除。という手法で以下関数で実現してみた。

/*
書式:array array_isunique(array $array){

返り値:値の重複している連想配列。
引数が配列でない,もしくは重複する値が0の時はfalseを返す。
*/

<?php
function array_isunique($array){

	if(!is_array($array)){
		return false;
	}

	$arrayValue = array_count_values($array);	//配列の値の数をカウントする
	$arraykey = array_keys($arrayValue,1);	//重複していない値のキーを取り出す
	
	for($i=0;$i<count($arraykey);$i++){
		unset($arrayValue[$arraykey[$i]]);	//重複していない要素を削除
	}
	if(count($arrayValue)!=0){
		return $arrayValue;
	}else{
		return false;
	}
}

/*別の方法 初期化された別の配列にarray_count_valuesでカウント1でないものを放り込んでいく*/
function array_isunique2($array){

	if(!is_array($array)){
    	return false;
	}
	$new_arr = array();
	
	$arrayValue = array_count_values($array);	//配列の値の数をカウントする	
	foreach($arrayValue as $key => $val){
		if($val!=1){
			$new_arr[$key] = $val;
		}
	}
	if(count($new_arr)!=0){
		return $new_arr;
	}else{
		return false;
	}
}
?>

どうかなどうかな?


追記

ついったーでmullinKAIさんに別のやり方でアドバイスをもらいました。
それを参考に作ったのがarray_isunique2。

速度比較もしました。

PEARベンチマークで100万回繰り返します。

実行結果
array_isunique  => 21.174700021744
array_isunique2 => 22.457356929779

あまり実行時間に差はないですね。

使うのはどちらでも良さそうです。