suffix3ForTier($t, 0); if ($s !== '') { $suffixByTier[$t] = $s; } } if ($suffixByTier === []) { return ['win_amount' => 0, 'matched_prize_tier' => null, 'match_detail' => ['reason' => 'no_suffix']]; } $snapshot = is_array($item->odds_snapshot_json) ? $item->odds_snapshot_json : null; $lines = []; $total = 0; $bestTier = null; $bestRank = 99; foreach ($combinations as $c) { /** @var TicketCombination $c */ $n = (string) $c->number_4d; if (strlen($n) < 3) { continue; } $suf = substr($n, -3); $hitTier = null; $rank = 99; foreach ($suffixByTier as $t => $sx) { if ($suf !== $sx) { continue; } $r = match ($t) { 'first' => 0, 'second' => 1, 'third' => 2, default => 99, }; if ($r < $rank) { $rank = $r; $hitTier = $t; } } if ($hitTier === null) { continue; } $oddsVal = $this->odds->oddsValueForScope($snapshot, $hitTier); $bet = (int) $c->bet_amount; $payout = (int) floor($bet * ($oddsVal / 10_000)); $total += $payout; $lines[] = ['number_4d' => $n, 'tier' => $hitTier, 'payout' => $payout]; if ($rank < $bestRank) { $bestRank = $rank; $bestTier = $hitTier; } } return [ 'win_amount' => $total, 'matched_prize_tier' => $bestTier, 'match_detail' => ['lines' => $lines], ]; } }