>我目前正在使用 php 来帮助我找到有效且不重复的条目,
我需要的
- 有效和不重复的列表 输入
- 无效输入列表(唯一)
- 重复输入列表
我的方法是首先为原始数组创建 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);
试试这个:
<?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);
?>
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将保存有效行的编号。现在花哨的算法,对不起...