程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php 數組過濾函數 array_filter與array_unique

php 數組過濾函數 array_filter與array_unique

編輯:關於PHP編程

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

語法
array_filter(array,function)
參數     描述
array     必需。規定輸入的數組。
function     自定義函數的名稱,為空時過濾掉所有值為flase的元素

 代碼如下 復制代碼

<?php
 
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"));
/*
 
Odd :
Array
(
   
[a] => 1
   
[c] => 3
   
[e] => 5
)
Even:
Array
(
   
[0] => 6
   
[2] => 8
   
[4] => 10
   
[6] => 12
)
*/

過濾掉PHP數組中的重復值

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

 代碼如下 復制代碼

<?php

$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<br/>";
$intStart1 = time();
$arrRS = array_unique($arrT);
$intEnd2 = time();
$intTime2 = $intEnd2-$intStart1;
echo "With array_unique function,Spend time:($intTime2)";
echo "<pre>";
print_r($arrT);
print_r($arrRF);
print_r($arrRS);
echo "</pre>";

?>


在$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));

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved