2012-04-16 47 views
0

找到有效的和非重複的條目我目前使用PHP來幫我找到的Valide和非重複的條目,算法在PHP

,我需要

  1. 的有效和非列表-duplicated
  2. 進入無效的輸入列表(唯一的)
  3. 重複輸入

我的方法,我的列表第一個創建原單5陣列2,1爲沒有錯誤(空), 1爲有效的(空的),1重複(空)

首先使用原單陣列中的一個,每一個元素:檢查有效 並檢查重複,如果無效,放入無效數組,並檢查重複使用inarray

畢竟,我得到一個無效和重複數組,然後使用原數組,檢查哪個元素不在這兩個數組中。和工作完成。

我的問題是,它似乎相當低效,我該如何改進它? (如果使用一些着名算法,則是優選的)

謝謝。

// get all duplicate input and store in an array 
    for ($row = 1; $row <= $highestRow; $row++) { 
    for ($y = 0; $y < $highestColumn; $y++) { 
     $val = $sheet->getCellByColumnAndRow($y, $row)->getValue(); 

//use reg exp to check whether it is valid 
     if ($y == $mailColumn && !preg_match($pattern,$val)) 
     {$invaild[]=$row;} 
//if valid, test whether it is duplicate 
     elseif ($y == $mailColumn && in_array($val,$email)) 
     {$duplicate[]=$val; 
     $duplicate[]=$row;} 

     if ($y == $mailColumn) 
     {$email[]=$val; 
     $email=array_unique($email);} 

     } 
    } 


// unique invalid array since i just need invalid inputs, not the invalid + duplicate input 
$invaild=array_unique($invaild); 

回答

1

試試這個:

<?php  
echo "<pre>";  

$array1 = array("[email protected]","c","c","[email protected]","test1","","test3","test2","test3");  

$array_no_mistake = array_filter($array1,function($subject){if(trim($subject)=="") return true;});  

$array_uniq = array_diff(array_unique($array1),$array_no_mistake);  

$array_dups = array_diff_assoc(array_diff($array1,$array_no_mistake),$array_uniq);  

$array_valid = array_filter($array_uniq,function($subject){  
    if (preg_match('/\A(?:[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z/i', $subject)) {  
    return true;  
} else {  
    return false;  
}  
});  


$array_invalid = array_diff_assoc($array_uniq,$array_valid);  


print_r($array1);  

print_r($array_no_mistake);  

print_r($array_uniq);  

print_r($array_dups);  

print_r($array_valid);  

print_r($array_invalid);  

?> 
+0

和這裏的工作代碼:http://codepad.viper-7.com/BLzcFb(刷新頁面,如果代碼是不顯示) – 2012-04-16 14:48:14

1

1)這似乎是你只在電子郵件列感興趣,所以我覺得這是在遍歷所有其他列的無點(所以內環基本上是多餘的)。

2)您可以使用關聯數組來存儲電子郵件作爲索引,稍後通過檢查數組中是否存在索引/電子郵件來有效查找重複數據。

下面是一個例子:

$valid = array(); 
$invalid = array(); 
$dups = array(); 

for ($row = 0; $row < $highestRow; $row++) 
{ 
    $email = $sheet->getCellByColumnAndRow($mailColumn, $row)->getValue(); 
    if (!preg_match($pattern, $email)) 
    { 
     $invalid[] = $row; 
    } 
    else if (isset($dups[ $email ])) 
    { 
     $dups[ $email ][] = $row; 
    } 
    else 
    { 
     $dups[ $email ] = array(); 
     $valid[] = $row 
    } 
} 

在本月底,$無效將容納所有的無效行的列表,$的DUP將舉行一個數組的數組,每個指示行中的當前電子郵件是索引,其值是一個列出共享此電子郵件的行的數組。如果某個索引處的數組爲空,則該電子郵件不會被複制。 $ valid將保存有效行的數量。 現在看中的算法,對不起......