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 {hot: [], cold: [], all: []} */ public function getHotColdNumbers($periods = 30, $type = 'all') { $num_model = new Num(); $colorMap = $num_model->column('color', 'num'); $animalMap = $num_model->column('animal', 'num'); $history = $this ->field('expect,num1,num2,num3,num4,num5,num6,num7,openTime') ->order('openTime', 'desc') ->limit($periods) ->select(); if (empty($history)) { return ['hot' => [], 'cold' => [], 'all' => []]; } $fields = ($type === 'special') ? ['num7'] : ['num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7']; // 统计每个号码的出现次数 $count = array_fill(1, 49, 0); $totalAppearances = 0; foreach ($history as $row) { foreach ($fields as $field) { $num = (int)$row[$field]; if ($num >= 1 && $num <= 49) { $count[$num]++; $totalAppearances++; } } } $all = []; for ($num = 1; $num <= 49; $num++) { $percent = $totalAppearances > 0 ? round($count[$num] / $totalAppearances * 100, 1) : 0; $all[] = [ 'num' => $num, 'count' => $count[$num], 'percent' => $percent, 'color' => $colorMap[$num] ?? '—', 'animal' => $animalMap[$num] ?? '—' ]; } // 按出现次数降序排序 $sorted = $all; usort($sorted, function ($a, $b) { return $b['count'] - $a['count']; }); // 热号: top 10, 冷号: bottom 10 $hot = array_slice($sorted, 0, 10); $cold = array_slice($sorted, -10); $cold = array_reverse($cold); return ['hot' => $hot, 'cold' => $cold, 'all' => $all]; } /** * 计算遗漏号码 * @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); } }