array_search()与array_column()是非常慢的,我怎么能加快这一点?



大家好,我有以下函数(删除内部内容):

/**
* @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;
}

最新更新