Я создал скрипт лотереи в php. Моя проблема теперь выбирает более одного победителя. Потому что игроки могут иметь одинаковый номер на своих билетах. Здесь я поставляю две структуры таблицы и исходный код.
lotto_game { id(int) jackpot(int) status(varchar10) pick_1(int) pick_2(int) pick_3(int) pick_4(int) pick_5(int) tickets_sold(int) winner(text) } lotto_picks { lotto_id(int) user_id(int) choice_1(int) choice_2(int) choice_3(int) choice_4(int) choice_5(int) ticket_status(int) }
Это мои две таблицы в моей базе данных. Для примера мы создадим 2 пользователя с идентификатором 1 и 2. Итак, что происходит, когда запускается скрипт, предполагается, что он изменит статус lotto_game с «active» на «finished», а затем добавит случайные номера лотереи в каждый pick_ * колонка.
$one = rand(1,30); $two = rand(1,30); $three = rand(1,30); $four = rand(1,30); $five = rand(1,30); mysql_query("UPDATE `lotto_game` SET pick_1 = '$one', pick_2 = '$two', pick_3 = '$three', pick_4 = '$four', pick_5 = '$five', status = 'finished'
WHERE status = 'active' ");
Я бы это признал. Но это только начало конца.
$lotto['tickets'] = mysql_query("SELECT ticket_id FROM `lotto_picks` WHERE ticket_status='valid'"); @$lotto[winners] = mysql_query("SELECT ticket_id,user_id FROM `lotto_picks` WHERE choice_1 = '$one' AND choice_2 = '$two' AND choice_3 = '$three' AND choice_4 = '$four' AND choice_5 = '$five'"); $lotto['num_tickets'] = mysql_num_rows($lotto['tickets']); @$lotto[winner_id] = mysql_fetch_array(@$lotto[winners]); $lotto['jackpot'] = mysql_query("SELECT jackpot FROM `lotto_game` WHERE status='active'"); $lotto['winner_jackpot'] = mysql_fetch_array($lotto['jackpot']); $lotto['num_winners'] = mysql_num_rows($lotto['winners']); //echo @$lotto['num_tickets']; //echo @$lotto['num_winners']; $winner = $lotto['num_winners']; //echo @$lotto['winner_id']['user_id']; $jackpot = $lotto['winner_jackpot']['jackpot']; $id = @$lotto[winner_id][user_id]; if ($winner == 1) { mysql_query("UPDATE `character` SET decivers = decivers +'$jackpot' WHERE user_id='$id'"); }
Это то, что я придумал, и похоже, что он работает с одним победителем. Но я просто не могу понять, куда идти отсюда. Я пытался использовать некоторые массивы, но ничего не работает. Я знаю, что нужно сделать, но не могу понять, как это сделать.
Когда я ищу победителей, мне нужно ввести в массив все свои идентификаторы пользователя.
так что дополнительные реквизиты – это деньги, если кто-то смущен этим. Статус в билетах здесь не имеет значения, но если вы знаете, это просто определяет, является ли ticket_status «действительным» или «недействительным»,
$winners_array = array(); if(mysql_num_rows($lotto['winners'])!=0){ while($row =mysql_fetch_array($lotto['winners'])){ if(!in_array($row['user_id'],$winners)) $winners[] = $row['user_id']; } }
$ winners будут массивом со всеми победителями user_ids
Я думаю, вы выбрали неправильные форматы хранения для выбранных вами номеров. Стандартный подход заключается в использовании двоичных значений, которые имеют N-й бит, если выбрано число N.
Рассмотрим этот пример: пользователь выбирает номера «2 4 5 9 11». Установка соответствующих бит в 1 дает «10100011010», который является десятичным числом 1306. Теперь лотерея выбирает «4 7 9 12 13», которая равна «1100101001000» == 6472. Выполнение побитового И по обоим значениям и подсчет количества бит, установленных в результат:
SELECT BIT_COUNT(1306 & 6472)
это сразу говорит нам, что у пользователя есть 2 правильных выбора. Так же легко вы можете выбрать «полных» победителей:
SELECT * FROM tickets WHERE BIT_COUNT(tickets.pick & lotto.pick) = 5
или сортировать билеты по количеству правильных выборов
SELECT * FROM tickets ORDER BY BIT_COUNT(tickets.pick & lotto.pick) DESC