PHP Echo Random Array и вставка в базу данных без повторения - PullRequest
0 голосов
/ 07 января 2019

У меня есть код, чтобы бросить номер ранда и показать победителя в зависимости от его шанса.

    $data = array();
    foreach($getAllUserTicketHistoryJson as $value){
        $data[$value['user_id']] = number_format((float)($value['total_ticket'] / $getAllTicketRound * 100), 2, '.', '');
    }
    $array=$data;
function chance($input=array())
{
    $number=rand(0,array_sum($input));
    $starter=0;
    foreach($input as $key => $val)
    {
        $starter+=$val;
        if($number<=$starter)
        {
                $ret=$key;
                break;
        }

    }

    return 'Winner is '.$ret.'<br/>';
    }
for($i=0;$i<3;$i++)
{
    echo chance($array).'<br><br>';
}

Это даст вывод как показано ниже.

Winner is 4


Winner is 3


Winner is 4

Проблема в том, что пользователь «4» победил дважды в первом и последнем раундах. Как помешать победителю победить дважды?

а как вставить каждого победителя в базу данных?

моя база данных выглядит так

=========================================
id  |  Round  |  first |  Second  | third
=========================================
1   |    1    |   4    |    3     |   1
=========================================

Я хочу добавить каждого победителя в базу данных «первый», «второй» и «третий». Таким образом, идентификатор победителя не будет удваиваться, чтобы предотвратить повторение.

пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 07 января 2019

Я не совсем точно отвечу на ваши вопросы, но дам вам альтернативный подход к решению проблемы. Давайте переформулируем шанс прежде всего как единое целое и переименуем его в тикет. Каждый билет имеет уникальный и равный шанс быть выбранным в каждом раунде.

Допустим, вы продали в общей сложности 100 билетов в лотерее X. Данная лотерея состоит из 5 раундов

$rounds = 1; // starting round
$maxRounds  = 5;
$tickets = range( 1, 100 );

Если вам нужно сравнить шансы игрока, у которого есть несколько билетов, это другой набор данных, который вы должны получить из своей базы данных. Для этого потребуется дополнительная таблица, содержащая эти данные, но она не должна «готовить» шанс появления билета. Если вам нужна эта статистика, вот пример (в php)

// total of 100 players
$players = range( 1, 100 ); 
$players = array_flip( $players );
 // assign a random number of purchases per player
for( $i = 1; $i <= 100; $players[$i] = mt_rand( 1, 20 ), ++$i );

В результате получается

.
$tickets = range( 1, array_sum( $players ) );

Вернуться к исходной проблеме. Теперь у вас есть всего продано tickets, и каждая лотерея имеет 5 раундов. Таким образом,

$rounds = 1;
$maxRounds  = 5;

while( $rounds <= $maxRounds )
{
    $winners = array_rand( $tickets, 3 );
    $tickets = array_diff( $tickets, $winners );
    shuffle( $winners );

    foreach( $winners as $pos => $winner )
    {
        ++$pos;
        echo "Loterry: {$rounds} - Price {$pos} - winner is {$winner}<br />";
    }

    ++$rounds;
}

Время настроить эхо с помощью чего-то, что вы сможете сохранить в своей базе данных за один раз. Поэтому я напишу последнюю часть для ясности. ПРИМЕЧАНИЕ , поскольку это простой пример и данные, которыми вы управляете, вы можете добавить их в свою базу данных, не фильтруя ее.

$rounds = 1;
$maxRounds  = 5;

$insert = [ ];

while( $rounds <= $maxRounds )
{
    $winners = array_rand( $tickets, 3 );
    $tickets = array_diff( $tickets, $winners );
    shuffle( $winners );

    $insert[$rounds][ ] = $rounds;

    foreach( $winners as $winner )
    {
        $insert[$rounds][ ] = $winner;
    }

    $insert[$rounds] = '(' . implode( ',', $insert[$rounds] ) . ')';

    ++$rounds;
}

$sql    = sprintf( "INSERT INTO `lotteries`( `round`, `first`, `second`, `third` ) VALUES %s;", implode( ', ', $insert ) );

С этого момента вы можете использовать это утверждение для вставки в вашу базу данных. Просто измените имя таблицы и поля на то, что у вас есть в вашей базе данных. Я надеюсь, что это помогло

0 голосов
/ 07 января 2019
<code>for($i=0;$i<2;$i++)
{
  chance($getAllUserTicketHistoryJson[rand(0,count($getAllUserTicketHistoryJson))]);
}
function chance($arrWinner = array()){
 // the array for winner is
echo "<pre> Winner array ";
print_r($arrWinner);
echo "
"; }

попробуйте это ... и если есть ошибка ... тогда дайте мне знать ... или добавьте экран с ошибкой, если это возможно

0 голосов
/ 07 января 2019
<?php

$ticket_numbers = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25);

shuffle($ticket_numbers);

$number_winners_required_per_round = 5;
$winner_count = 0;
$number_of_rounds = 3;
$round_number = 0;

while ( $round_number < $number_of_rounds) {
    $round_number++;
    echo "Round $round_number:";

    while ($winner_count < $number_winners_required_per_round ) {
        $winner[$winner_count] = array_pop($ticket_numbers);
        echo "<p>The winning ticket number $winner_count is ticket number: {$winner[$winner_count]}</p>";
        $winners[$round_number][] = $winner[$winner_count];
        $winner_count++;
    }
    $winner_count = 0;
}
var_dump($winners);
?>

$ ticket_numbers будет заполняться из фида JSON. Каждый раз, когда запускается основной цикл, выбирается необходимое количество победителей, номера их билетов удаляются из списка потенциальных победителей. Создается массив победителей, который будет использоваться для ввода победителей в базу данных. Каждый билет может выиграть только один раз.

0 голосов
/ 07 января 2019

Измените свой код с помощью

<code>for($i=0;$i<2;$i++)
{
  chance($getAllUserTicketHistoryJson[rand(0,count($getAllUserTicketHistoryJson))]).'<br><br>';
}
function chance($arrWinner = array()){
 // the array for winner is
echo "<pre> Winner array : ";
print_r($arrWinner);
echo "
"; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...