今天执行一个数据处理任务时,觉得效率太差,于是对问题进行了排查,后来发现问题出自对大数组进行[in_array]判断上。
以下为原本的大体业务逻辑:
$dataIds = array; $resultData = []; foreach($otherList as $item) { if(!in_array($item[‘field‘], $dataIds)) { $resultData[] = $item; $dataIds[] = $item[‘field‘]; } } DbExecute::insert($resultData);
执行效率如图:
于是修改为采用[array_flip]+[isset]的方式处理业务,即首先将数组的键值反转,然后判断下标是否存在。
修改后的大体业务逻辑如下:
$dataIds = array; $dataIds = array_flip($dataIds); $resultData = []; foreach($otherList as $item) { if(!isset($dataIds[$item[‘field‘]])) { $resultData[] = $item; $dataIds[$item[‘field‘]] = 1; } } DbExecute::insert($resultData);
执行效率如图: