大家好,我有以下函数(删除内部内容):
/**
* @param int $lastSyncTimeStampLocal
* @return void
*/
protected function compareData(int $lastSyncTimeStampLocal): void
{
$time_start = microtime(true);
foreach ($this->localData as $row) {
$key = array_search($row['uuid'], array_column($this->masterData, 'uuid'));
}
$time_end = microtime(true);
$execution_time = ($time_end - $time_start)/60;
}
此函数用于比较两组数据。问题是array_search在处理大量数据时非常慢。
例如,如果$this->localData和$this->masterData都包含10000条记录,则该函数大约需要30秒才能完成。我想知道是否有一个替代/任何事情我可以改变,使这快得多?注意uuid是像'dkdue29u29dbiyedh92dye'这样的字符串
谢谢你的帮助
很难用大型结果集进行测试,但我希望这能成功。
首先是尽量不要在循环中重复任何操作。因此,array_column
调用被移出循环。
而不是使用array_search()
,使用值作为键意味着您可以只做数组引用。但是单独使用array_flip()
将意味着你最终会得到最后出现的而不是第一个。因此,这段代码使用array_reverse()
后跟array_flip()
来表示您最终得到一个由uuid键控的数组,其值是数组中的位置。
(可能值得打印出$uuids
数组来了解我的意思)。
然后在循环中,您只需使用$uuids[$row['uuid']]
直接访问数组,并使用?? -1
在值不存在时设置-1。
$uuids = array_flip(array_reverse(array_column($this->masterData, 'uuid')));
foreach ($this->localData as $row) {
$key = $uuids[$row['uuid']] ?? -1;
}