【问题标题】:Prevent Foreach Array Give Same Value [duplicate]防止 Foreach 数组给出相同的值 [重复]
【发布时间】:2019-01-07 14:50:30
【问题描述】:

我有这个数组代码

$data = array();
foreach($getAllUserTicketHistoryJson as $value){
    $data[$value['user_id']] = number_format((float)($value['total_ticket'] / $getAllTicketRound * 100), 2, '.', '');
}
$array=$data;

这将给出输出

array(4) { [4]=> string(5) "16.28" [3]=> string(4) "5.81" [2]=> string(5) "11.63" [5]=> string(5) "66.28" } 

数组为 user_id,获胜几率为 100%。

我想显示 3 个随机获胜者,而不重复第一个获胜者。意味着如果用户已经获胜,他们将无法再次获胜。

我创建了这段代码

    $number=rand(0,array_sum($array));
    $starter=0;
    foreach($array as $key => $val)
    {
        $starter+=$val;
        if($number<=$starter)
        {
                $ret=$key;
                break;
        }
    }
for($i=0;$i<3;$i++)
{
    echo 'Winner is '.$ret.'<br/>';
}

代码会给出输出

Winner is 5
Winner is 5
Winner is 5

问题是,如何在不重复第一个获胜者的情况下,根据他们的机会显示 3 个获胜者。结果应该是这样的

Winner is 4
Winner is 5
Winner is 2

谢谢你帮助我

【问题讨论】:

  • 请勿转载。

标签: php arrays


【解决方案1】:

你需要这样的东西,你可以在这里测试一下:http://sandbox.onlinephpfunctions.com/code/0660c7223d301341cbb452314d18945b546e51c5

它将将阵列传递给一个函数,因此选择获奖者时,它也会从阵列中删除,因此无法再次选择它。

// TEST DATA
$array = [
    4 => '16.28',
    3 => '5.81',
    2 => '11.63',
    5 => '66.28',
];

// GET WINNER
// pass the array by reference, so the winner can be removed (unset) from it
function getWinner(&$array) {
    $number=rand(0,array_sum($array));
    $starter=0;
    foreach($array as $key => $val)
    {
        $starter+=$val;
        if($number<=$starter)
        {
            unset($array[$key]);
            return $key;
        }
    }
}
// GET 3 WINNERS
for($i=0;$i<3;$i++)
{
    echo 'Winner is '.getWinner($array)."\n";
}

【讨论】:

  • 谢谢,这个有效的代码
猜你喜欢
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 2021-10-23
  • 2015-09-06
  • 1970-01-01
相关资源
最近更新 更多