【问题标题】:PHP Echo Random Array and Insert to Database without repeatPHP Echo 随机数组并插入数据库而不重复
【发布时间】:2019-06-01 19:03:13
【问题描述】:

我有一个代码来滚动一个随机数,并根据他们的机会显示获胜者。

    $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不会翻倍,防止重复。

请帮忙。

【问题讨论】:

标签: php arrays database


【解决方案1】:

修改你的代码

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

【讨论】:

  • 你从哪里得到 $arrWinner 字符串?我的是 $input
  • 尝试编辑过的...在 $arrWinner 中,您将获得获胜者的数组...使用该代码,您将只获得 3 个数组...玩它...玩得开心
  • 得到这个错误通知:未定义的偏移量:4 in and in pre Winner array :
【解决方案2】:
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 "</pre>";
}

试试这个......如果有错误......然后让我知道......或者如果可能的话添加屏幕错误

【讨论】:

  • 注意:未定义的偏移量:4 in C:\xampp\htdocs\... on line 75 Winner array , line 75 is chance($getAllUserTicketHistoryJson[rand(0,count($getAllUserTicketHistoryJson))] );
【解决方案3】:
<?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 提要中填充。每次运行主循环时,都会选择所需数量的获胜者,他们的票号将从潜在获胜者列表中删除。生成的获胜者数组将用于将获胜者输入数据库。每张票只能中奖一次。

【讨论】:

  • 不错的分享,你能在那里增加一个机会吗?因为我的代码使用 user_id 和他们的机会,所以 $data 输出像这样 $array=array('black' => 15.30, 'brown' => 20.20, 'kitty' => 15.30, 'lala' => 15.20, 'popi ' => 14.00, '迎来' => 20.00);
【解决方案4】:

我不会完全准确地回答您已经提出的问题,但会为您提供另一种解决问题的方法。让我们首先将机会重述为单个实体并将其重命名为ticket。每张票在每一轮中都有独特且平等的机会被选中。

假设您在彩票 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 ) );

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

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多