// 使用更语义化的变量名
$timeFields = [
    'start_time' => 1,
    'return_time' => 2,
];

// 循环数据
foreach ($data as $datum) {
    foreach ($timeFields as $field => $type) {
        if (!empty($datum->$field)) {
            foreach ($datum->$field as $time) {
                $resultData[] = [
                    'id' => $datum->id,
                    's_day' => $datum->s_day,
                    'type' => $type,
                    'time' => $time,
                    'line' => $datum['lines'],
                    'start_point' => $datum['lines']['point'][0]['point'],
                    'end_point' => $datum['lines']['point'][count($datum['lines']['point']) - 1]['point'],
                    'num' => 0,
                ];
            }
        }
    }
}

// 循环匹配数据和结果进行关联
foreach ($resultData as &$result) {
    foreach ($subscribeNum as $subscribe) {
        if ($subscribe->line_id == $result['line']['id'] && $subscribe->line_start_time == $result['time']) {
            $result['num'] = $subscribe->num;
            break;
        }
    }
}

// 根据调用方及条件过滤不符合条件的数据
$lineIds = [];
foreach ($resultData as $item) {
    if ($api) {
        if ($busSet > $item['num'] && !in_array($item['line']['id'], $lineIds)) {
            $lineIds[] = $item['line']['id'];
            $result[$item['line']['id']] = $item;
        }
    } else {
        $result[] = $item;
    }
}

// 查询预约数据
$subscribe = $subscribeService->model
    ->where([
        ['status', '=', config('status.enable')],
        ['line_id', 'in', $lineIds]
    ])
    ->whereDay('s_day', $param['date'])
    ->field('line_id,line_start_time,point_id,count(0) as num')
    ->group('line_id,line_start_time,point_id')
    ->select()
    ->toArray();

// 处理结果数据
foreach ($result as &$resultDatum) {
    $date = strtotime(date('Y-m-d ') . $resultDatum['time'] . ':00');
    $pointArray = $resultDatum['line']['point'];
    foreach ($pointArray as &$point) {
        $num = 0;
        $point['num'] = $num;
        $date = strtotime('+{$point['time']} minute', $date);
        $point['time'] = date('H:i', $date);
        foreach ($subscribe as $s) {
            if ($resultDatum['line']['id'] == $s['line_id'] && $resultDatum['time'] == $s['line_start_time'] && $s['point_id'] == $point['id']) {
                $point['num'] = $s['num'];
                break;
            }
        }
    }
    $resultDatum['line']['point'] = $pointArray;
}

优化说明:

  1. 变量名优化: 使用更具描述性的变量名,如将 $fields 改为 $timeFields$d 改为 $datum,提高代码可读性。
  2. 减少嵌套循环: 尽量减少循环嵌套层级,例如在处理 $subscribeNum 时,可以使用哈希表或其他数据结构来优化查询效率。
  3. 代码结构: 添加注释,解释代码逻辑,使代码更易于理解和维护。

其他建议:

  • 可以考虑使用 PHP 的数组函数,例如 array_map, array_filter 等,简化代码逻辑,提高代码效率。
  • 如果数据量较大,可以考虑使用数据库索引、缓存等机制,进一步提升性能。

希望以上信息对您有所帮助!

PHP代码优化:提升循环效率

原文地址: https://www.cveoy.top/t/topic/fWTO 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录