PHP Echo随机数组,无需重复插入数据库

时间:2019-01-07 05:20:28

标签: php arrays database

我有一个代码来编码兰德数,并根据获胜者的机会向获奖者展示。

    $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
=========================================

我想将每个优胜者插入数据库“第一”,“第二”和“第三”。因此,优胜者ID不会加倍以防止重复。

请帮助。

4 个答案:

答案 0 :(得分:0)

使用更改代码

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 "</pre>";
}

答案 1 :(得分:0)

APN

尝试此操作...如果出现错误...然后让我知道...或在可能的情况下添加错误提示的屏幕

答案 2 :(得分:0)

<?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 feed填充。每次运行主循环时,都会选择所需数量的获胜者,其彩票号码将从潜在获胜者列表中删除。生成一系列获奖者,这些获奖者将用于将获奖者输入数据库。每张票只能赢一次。

答案 3 :(得分:0)

对于您已经提出的问题,我不会完全准确,但是会为您提供解决问题的另一种方法。让我们首先将机会重新陈述为一个实体,然后将其重命名为工单。每张票都有独特且平等的机会被选中。

让我们说您在X彩票中总共售出了100张彩票。给定的彩票包括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 ) );

从这里开始,您可以使用此语句在数据库中插入。只需将表名和字段更改为数据库中实际拥有的内容即可。希望对您有帮助