0

我目前正在使用 php 来帮助我找到有效且不重复的条目,

我需要的

  1. 有效且不重复的列表
  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);
4

2 回答 2

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
    }
}

最后,$invalid 将保存所有无效行的列表,$dups 将保存一个数组数组,每个表示当前电子邮件作为索引的行,其值是一个列出行的数组分享这封电子邮件。如果某个索引处的数组为空,则电子邮件不重复。$valid 将保存有效行数。现在花哨的算法,对不起...

于 2012-04-16T11:56:45.157 回答
1

试试这个:

<?php     
echo "<pre>";    

$array1 = array("a@b.com","c","c","d@e.com","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);    

?>
于 2012-04-16T12:02:04.373 回答