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;
}