2

比較しようとしている 2 つの多次元配列があり、どちらも電子メール アドレス データを持ちますが、キーは異なります。両方の配列に存在しない電子メール アドレスをすべて取得して保存する必要があります。これをスピードアップする方法はありますか?

$accts: ID、メール、column1 - 13000 行

$db_accts: id1, name, accountID,Email_Address__c - 17000 行

今、私は持っています

foreach($accts as $acct){
    $exists = false;
    foreach($db_accts as $db_acct){
        if($acct['Email'] == $db_acct['Email_Address__c'])
        {   $exists = true;}
    }

    if(!$exists)
    {   $update[] = array('Email'=>$acct['Email'],'column1'=>'');
    }

}

foreach($db_accts as $db_acct){
    $exists = false;
    foreach($accts as $acct){
        if($acct['Email'] == $db_acct['Email_Address__c'])
            $exists = true; 
    }
    if(!$exists)
    {
        $update[] = array('Email'=>$db_acct['Email_Address__c'],'column1'=>'Y');
    }
}
4

5 に答える 5

0

手で

アルゴリズム的に、あなたがしていることはO(|accts| * |db_accts|).

両方のアカウントをメールで並べ替えることができますO(|accts| * log(|accts|)) + O(|db_accts| * log(|db_accts|))。次に、次のことができます。

  1. 両方の最初の要素から開始し、
  2. 比較
  3. の要素acctsが大きい場合は、それを保存して次の要素に繰り返しますaccts
  4. 同様に の要素db_acctsが大きい場合
  5. 両方が同じ場合は、保存せずに両方を繰り返します。
  6. goto 3. まだ要素がある場合

比較にはO(|accts| + |db_accts|). DB から電子メールで並べ替えられた場合、上記の並べ替え手順は省略されます。それ以外の場合は でありO(n log(n))、 よりもはるかに小さいですO(n^2)

これにより、データセットが約 1000 高速化されます ( log(17000) vs 13000)。

PHP での並べ替えについては、Sort Multi-dimensional Array by Value をご覧ください。

SQL については、MySQL の「Group By」および「Order By」を参照してください。

PHPで

多次元配列で array_diff() を使用できます。

于 2015-10-14T16:24:26.560 に答える
0

array_udiff比較をカスタマイズできるため、次を使用する必要があります。

array_udiff($accts,$db_accts,function($act,$dbact){
     return strcasecmp($act['Email'], $db_act['Email_Address__c']);
 });
于 2013-01-08T19:34:47.640 に答える
0

おそらく、array_diff を使用してこれを高速化できます: http://de3.php.net/array_diff

于 2013-01-08T19:18:46.230 に答える
0

array_diff()を使用します。

ドキュメントを参照してください。例は非常に明確です。2 つの配列を入力array_diff()し、異なる配列を吐き出します。あなたの場合、両方の配列に含まれていない電子メール。

于 2013-01-08T19:19:01.930 に答える
0

独自の PHP コードを使用すると、標準の PHP 関数を使用するよりもはるかに遅くなります。PHP の標準関数は下位レベルで実行されるため、オーバーヘッドが少なくなります。array_diffなどの関数を使用すると、はるかに効率的になります。

于 2013-01-08T19:19:06.010 に答える