天天看點

php 過濾array,php 數組過濾函數 array_filter與array_unique

在php中我給大家介紹兩個比較常用的數組過濾函數array_filter與array_unique了,一個是過濾數組空值,一個是過濾數組重複值,我們現在一起來看看。

文法

array_filter(array,function)

參數     描述

array     必需。規定輸入的數組。

function     自定義函數的名稱,為空時過濾掉所有值為flase的元素

 代碼如下 複制代碼

function odd($var) {

return($var & 1);

}

function even($var) {

return(!($var & 1));

}

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);

$array2 = array(6, 7, 8, 9, 10, 11, 12);

echo "Odd :n";

print_r(array_filter($array1, "odd"));

echo "Even:n";

print_r(array_filter($array2, "even"));

過濾掉PHP數組中的重複值

去除一個數組中的重複值,可以使用foreach方法,也可以使用array_unique方法,下面的代碼兩種方法都使用了

 代碼如下 複制代碼

$arrF = array();

$arrS = array();

$intTotal = 100;

$intRand = 10;

for($i=0; $i < $intTotal; $i )

{

$arrF[] = rand(1, $intRand);

$arrS[] = rand(1, $intRand);

}

$arrT = array_merge($arrF, $arrS);

$arrRF = array();

$intStart = time();

foreach($arrT as $v)

{

if(in_array($v, $arrRF))

{

continue;

}

else

{

$arrRF[] = $v;

}

}

$intEnd = time();

$intTime = $intEnd-$intStart;

echo "With Continue,Spend time:$intTime

";

$intStart1 = time();

$arrRS = array_unique($arrT);

$intEnd2 = time();

$intTime2 = $intEnd2-$intStart1;

echo "With array_unique function,Spend time:($intTime2)";

echo "

";      

print_r($arrT);

print_r($arrRF);

print_r($arrRS);

echo "

";

?>

在$intTotal比較小的情況下,比如說1000以内,$intRand的取值基本不影響結果,兩者執行的時間都差不多。

測試$intTotal 大于10000時,$intRand取值100時,使用array_unique的效率要高于foreach循環判斷,$intRand=10,兩者執行時間一緻。

是以,可以得出結論,當數組容量不大,大概在1000以内時,使用兩者的執行效率差不多。

當數組容量比較大時(具體應該到什麼值,我沒有詳細測試,感興趣的可以确定一下這個值),随着$intRand的逐漸增大,array_unique的表現更好,我不使用$intTotal/$intRand這個比值,是因為,感覺并不是成比例變化,但是基本會遵循比值越大,array_unique表現越好。

綜上所述,在過濾數組重複值的時候,建議使用array_unuique,數組不大的時候兩者效率等同,而array_unique使用當然讓你的代碼一下子減了好幾行,數組容量過大時,函數的表現更好

二維數組去重複項函數

PHP數組去除重複項 有個内置函數array_unique (),但是php的 array_unique函數隻适用于一維數組,對多元數組并不适用,以下提供一個二維數組 的 array_unique函數

 代碼如下 複制代碼

function unique_arr($array2D,$stkeep=false,$ndformat=true)

{

// 判斷是否保留一級數組鍵 (一級數組鍵可以為非數字)

if($stkeep) $stArr = array_keys($array2D);

// 判斷是否保留二級數組鍵 (所有二級數組鍵必須相同)

if($ndformat) $ndArr = array_keys(end($array2D));

//降維,也可以用implode,将一維數組轉換為用逗号連接配接的字元串

foreach ($array2D as $v){

$v = join(",",$v);

$temp[] = $v;

}

//去掉重複的字元串,也就是重複的一維數組

$temp = array_unique($temp);

//再将拆開的數組重新組裝

foreach ($temp as $k => $v)

{

if($stkeep) $k = $stArr[$k];

if($ndformat)

{

$tempArr = explode(",",$v);

foreach($tempArr as $ndkey => $ndval) $output[$k][$ndArr[$ndkey]] = $ndval;

}

else $output[$k] = explode(",",$v);

}

return $output;

}

測試

$array2D = array('first'=>array('title'=>'1111','date'=>'2222'),'second'=>array('title'=>'1111','date'=>'2222'),'third'=>array('title'=>'2222','date'=>'3333'));

print_r($array2D);

print_r(unique_arr($array2D,true));