array_search() 和 array_column() 非常慢,我怎样才能加快速度?
array_search() with array_column() is very slow, how can I speed this up?
大家好我有以下功能(去掉了内部的东西):
/**
* @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;
}
这个功能是比较2组数据。问题是 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;
}
大家好我有以下功能(去掉了内部的东西):
/**
* @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;
}
这个功能是比较2组数据。问题是 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;
}