0

現在、有効で重複していないエントリを見つけるためにphpを使用しています。

私が必要なもの

  1. 有効で重複していないリスト
  2. 無効な入力のリストを入力します (一意)
  3. 重複入力のリスト

私のアプローチは、最初に5つの配列2をオリジナルに、1を間違いのない(空)、1を有効(空)、1を複製(空)に作成することです

最初に元の配列の 1 つを使用して、1 つの要素ごとに : 有効をチェックして重複をチェックし、無効な場合は無効な配列に入れ、inarray を使用して重複をチェックします。

結局、私は無効と重複の1つの配列を取得し、元の配列を使用して、その2つの配列に含まれていない要素を確認します。そして、仕事は終わりました。

私の問題は、どうすればそれを改善できるかということです。(有名なアルゴリズムを使用する場合に適しています)

ありがとうございました。

   // 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 に答える