2012-04-16 48 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将保存有效行的数量。 现在看中的算法,对不起......