我有两个多维数组,都有电子邮件地址数据,但是我想要比较不同的键。我需要获取两个阵列中不存在的所有电子邮件地址,并存储它们。有没有办法可以加快速度呢?
$ 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');
}
}
答案 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|))
。然后,你可以
accts
的元素较大,请将其存储并迭代到accts
db_accts
的元素更大比较应该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"。