加快阵列比较

时间:2013-01-08 19:15:31

标签: php

我有两个多维数组,都有电子邮件地址数据,但是我想要比较不同的键。我需要获取两个阵列中不存在的所有电子邮件地址,并存储它们。有没有办法可以加快速度呢?

$ 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');
    }
}

5 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

使用array_diff()

参见文档,这个例子非常清楚。你输入两个数组,array_diff()吐出不同的数组。在您的情况下,两个数组中都没有包含电子邮件。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您应该使用array_udiff,因为它允许您自定义比较:

array_udiff($accts,$db_accts,function($act,$dbact){
     return strcasecmp($act['Email'], $db_act['Email_Address__c']);
 });

答案 4 :(得分:0)

手工

在算法上,你正在做的是O(|accts| * |db_accts|)

您可以通过电子邮件对这两个帐户进行排序,这需要O(|accts| * log(|accts|)) + O(|db_accts| * log(|db_accts|))。然后,你可以

  1. 从两者的第一个元素开始,
  2. 比较
  3. 如果accts的元素较大,请将其存储并迭代到accts
  4. 中的下一个元素
  5. 同样如果db_accts的元素更大
  6. 如果两者相同,则在不存储的情况下迭代两者。
  7. 转到3.如果还有元素
  8. 比较应该O(|accts| + |db_accts|)。如果您通过电子邮件从DB中对它们进行排序,则会省略上面的排序步骤。否则,它是O(n log(n)),小于O(n^2)

    这会导致数据集(log(17000) vs 13000)的加速速度达到1000左右。

    要在PHP中进行排序,请查看Sort Multi-dimensional Array by Value

    对于SQL,请参阅MySQL "Group By" and "Order By"

    通过PHP

    您可以使用array_diff() with multidimensional arrays