在 php 中查找有效和非重复条目的算法


Algorithm in finding valid and non-duplicate entries in php

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

我需要的

  1. 有效和不重复的列表
  2. 输入
  3. 无效输入列表(唯一)
  4. 重复输入列表

我的方法是首先为原始数组创建 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将保存有效行的编号。现在花哨的算法,对不起...