column('color', 'num'); $history = $this ->field('expect,num1,num2,num3,num4,num5,num6,num7,openTime') ->order('openTime', 'asc') ->limit($periods) ->select(); if (empty($history)) { return ['expects' => [], 'data' => [], 'colorMap' => []]; } $expects = []; $data = []; foreach ($history as $row) { $expects[] = (string)$row['expect']; if ($type === 'special') { $data[] = ['num7' => (int)$row['num7']]; } else { $row_data = []; for ($i = 1; $i <= 7; $i++) { $row_data['num' . $i] = (int)$row['num' . $i]; } $data[] = $row_data; } } return [ 'expects' => $expects, 'data' => $data, 'colorMap' => $colorMap ]; } /** * 计算遗漏号码 * @param int $periods 查询最近多少期 * @param string $type 查询类型 all=全部号码 special=仅特码 * @return array [{num: int, omit: int, color: string}, ...] */ public function getMissingNumbers($periods = 10, $type = 'all') { // 查询最近 $periods 期开奖数据 if ($type === 'special') { $history = $this ->field('expect,num7') ->order('openTime', 'desc') ->limit($periods) ->select(); } else { $history = $this ->field('expect,num1,num2,num3,num4,num5,num6,num7') ->order('openTime', 'desc') ->limit($periods) ->select(); } // 收集最近 $periods 期出现过的号码 $appeared = []; foreach ($history as $row) { if ($type === 'special') { $fields = ['num7']; } else { $fields = ['num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7']; } foreach ($fields as $field) { if ($row[$field] !== null && $row[$field] !== '') { $appeared[(int)$row[$field]] = true; } } } // 获取遗漏号码(1-49中未出现的) $missing = []; for ($num = 1; $num <= 49; $num++) { if (!isset($appeared[$num])) { $missing[] = $num; } } // 查询更多历史数据用于计算遗漏期数 if ($type === 'special') { $allHistory = $this ->field('num7') ->order('openTime', 'desc') ->limit(500) ->select(); } else { $allHistory = $this ->field('num1,num2,num3,num4,num5,num6,num7') ->order('openTime', 'desc') ->limit(500) ->select(); } // 查询波色映射 $num_model = new Num(); $colorMap = $num_model->column('color', 'num'); // 计算遗漏期数并组装结果 $result = []; foreach ($missing as $num) { $omitCount = $this->calcOmitCount($num, $allHistory, $type); $result[] = [ 'num' => $num, 'omit' => $omitCount, 'color' => $colorMap[$num] ?? '—' ]; } // 按遗漏期数降序排序 usort($result, function ($a, $b) { return $b['omit'] - $a['omit']; }); return $result; } /** * 计算某个号码的遗漏期数 * @param int $num 号码 * @param array $allHistory 历史数据(已按openTime DESC排序) * @param string $type 查询类型 all=全部号码 special=仅特码 * @return int 遗漏期数 */ private function calcOmitCount($num, $allHistory, $type = 'all') { foreach ($allHistory as $idx => $row) { if ($type === 'special') { if ((int)$row['num7'] === $num) { return $idx; } } else { for ($i = 1; $i <= 7; $i++) { if ((int)$row['num' . $i] === $num) { return $idx; } } } } return count($allHistory); } }