1

我有些犹豫地走来走去,我传递了一个带有子元素的数组(可以这么说),我需要三个随机值,但这些都是在不重复的情况下获得的。

数组如下:

    大批
    (
        [0] => 数组
            (
                [uid] => 1
                [ticket_code] => 0oreb8yo
            )

        [1] => 数组
            (
                [uid] => 1
                [ticket_code] => 2oeii8hm
            )

        [2] => 数组
            (
                [uid] => 1
                [ticket_code] => m0dwtjiw
            )

        [3] => 数组
            (
                [uid] => 1
                [ticket_code] => q6c7cymb
            )

        [4] => 数组
            (
                [uid] => 1
                [ticket_code] => zyqhm5bj
            )

        [5] => 数组
            (
                [uid] => 1
                [ticket_code] => amdqzjpi
            )

        [6] => 数组
            (
                [uid] => 2
                [ticket_code] => tzql7l42
            )

        [7] => 数组
            (
                [uid] => 2
                [ticket_code] => gap0r6vf
            )

        [8] => 数组
            (
                [uid] => 2
                [ticket_code] => ypqum5yz
            )

        [9] => 数组
            (
                [uid] => 4
                [ticket_code] => smupluac
            )

        [10] => 数组
            (
                [uid] => 4
                [ticket_code] => 9d8jsha7
            )

        [11] => 数组
            (
                [uid] => 5
                [ticket_code] => 6hdnja42
            )

    )

我需要你获得 3 个“ticket_code”,但无权重复“uid”。

我一直在尝试如下,但也重复“uid”。

$ticketsWinners = array();
  for ($i=0; $i < 3; $i++) {
    $aux = array_rand($allTickets);
    $aux2 = $allTickets[$aux]['uid'];

    $ticketsWinners[] = array(
      'uid' => $aux2,
      'ticket_code' => $allTickets[$aux]['ticket_code']
    );
  }

有什么方法可以做到不重复吗?

如果有人知道的话,我们提前谢谢你^^

4

3 回答 3

1

尝试类似:

$ticketsWinners = array();
while (sizeof($ticketsWinners) < 3) {
    $aux = array_rand($allTickets);
    // array_rand return array of keys so you need first value only
    $uid = $allTickets[$aux[0]]['uid']

    // add uid as a key so ass not tot check all $allTickets values
    if (!isset($ticketsWinners[$uid]))
        $ticketsWinners[$uid] = $allTickets[$aux[0]]; 
}
// if you need $allTickets back to numeric keys [0, 1, 2]
$allTickets = array_values($allTickets);

如果你害怕无限循环(真的会发生),那么试试这个:

$ticketsWinners = array();
// shuffle array before checking
shuffle($allTickets);
foreach ($allTickets as $tick_data) {
    $uid = $tick_data['uid'];

    if (!isset($ticketsWinners[$uid]))
        $ticketsWinners[$uid] = $tick_data;

    if (sizeof($ticketsWinners) == 3)
        break;
}

在最坏的情况下,您检查$allTickets数组并获得 size 的获胜者<= 3

于 2014-07-06T06:28:33.443 回答
0

尝试这个:

$ticketsWinners = array();
$ticketUid = array();
for ($i=0; $i < 3; $i++) {
    $aux = array_rand($allTickets);
    $aux2 = $allTickets[$aux]['uid'];

    if(! in_array($aux2, $ticketUid)) {
        $ticketUid[$i] = $aux2;

        $ticketsWinners[] = array(
          'uid' => $aux2,
          'ticket_code' => $allTickets[$aux]['ticket_code']
        );
    } else {
        $i--;
    }
}
于 2014-07-06T06:32:03.133 回答
0

这种结构会更好(票号唯一的额外好处)

$tickets = Array
    (
    '0oreb8yo' => 1,              
    '2oeii8hm' => 1,
    'm0dwtjiw' => 1,
    'q6c7cymb' => 1,
     'zyqhm5bj' => 1,
    'amdqzjpi' => 1,
    'tzql7l42' => 2,
    'gap0r6vf' => 2,
    'ypqum5yz' => 2,
    'smupluac' => 3,
    '9d8jsha7' => 4,
    '6hdnja42' => 5,
    );

        $winners = array();
        $picks = 3;
        for($i = 0; $i < $picks; $i++){
if(count($tickets) == 0 ){
break; //or error -- shouldn't need this unless picks exceed uids
}
            $ticket = array_rand($tickets);
            $winner = $tickets[$ticket];
            $winners[] = $winner;
            $tickets = array_filter($tickets, function($item) use ($winner){
                return $winner != $item;
            });
        }

        echo '<pre>';
        var_export($winners);

输出

array (
  0 => 2,
  1 => 1,
  2 => 4,
)

array (
  0 => 2,
  1 => 1,
  2 => 3,
)

array (
  0 => 1,
  1 => 3,
  2 => 2,
)

与 while 选项不同,这将通过减少 uid 的票证数组来减少 for 循环的每个循环的操作。这也是确保你不会总是用票拉出用户的唯一方法,如果用户 1 购买了 90% 的票,你会在 90% 的时间循环在他身上,无论如何你必须减少票数组获胜者如果他们只能赢一次。本质上,当他们获胜时,您会从列表中删除每个 uid。您还可以确定每张票都有相同的获胜机会(以及 array_rand 是随机的)——它们都有平等的地位。

loop1 后的票证数组减少

array (
  'tzql7l42' => 2,
  'gap0r6vf' => 2,
  'ypqum5yz' => 2,
  'smupluac' => 3,
  '9d8jsha7' => 4,
  '6hdnja42' => 5,
)

循环2之后

array (
  'smupluac' => 3,
  '9d8jsha7' => 4,
  '6hdnja42' => 5,
)

循环3之后

array (
  'smupluac' => 3,
  '6hdnja42' => 5,
)

获胜者

array (
  0 => 1,
  1 => 2,
  2 => 4,
)

退回uid和wining ticket change

$winners[] = $winner;

$winners[$ticket] = $tickets[$ticket];

现在获胜者将是,就像输入数组一样

ticketnumber => uid

票是关键(这是票)和获胜者是价值(这是 uid )

于 2014-07-06T06:46:01.543 回答