2

我有两个多维数组,都包含电子邮件地址数据,但不同的键,我试图比较。我需要获取两个数组中都不存在的所有电子邮件地址,并将它们存储起来。有没有办法可以加快速度?

$accts: id、Email、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

您可能可以使用 array_diff 加快速度:http: //de3.php.net/array_diff

于 2013-01-08T19:18:46.230 回答
0

使用array_diff()

看文档,例子真的很清楚。您输入两个数组并array_diff()吐出不同的数组。在您的情况下,两个数组中都不包含的电子邮件。

于 2013-01-08T19:19:01.930 回答
0

使用您自己的 PHP 代码比使用标准 PHP 函数要慢得多。PHP 的标准函数在较低级别上运行,因此开销较小。使用诸如array_diff之类的函数会更有效率。

于 2013-01-08T19:19:06.010 回答
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

用手

从算法上讲,您正在做的是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“分组依据”和“排序依据”

通过 PHP

您可以将array_diff() 与多维数组一起使用。

于 2015-10-14T16:24:26.560 回答