用于抽奖的PHP数组

ilmyapht  于 2022-12-25  发布在  PHP
关注(0)|答案(1)|浏览(147)
    • 我在尝试打造一个raffle系统**
  • 可能的总数为60,000
  • 我卖了一万张票
  • 我必须使用50,000张未使用的彩票......因此每张彩票都有额外的"机会"赢取。50,000张未售出彩票除以10,000张售出彩票
  • 每张门票可获得5次额外机会。

知道了这一点,我需要的是这样的东西:

    • 票证:机会1、机会2、机会3、机会4、机会5**
  1. 00001: ["20000","20001","40000","40001","60000"]
  2. 00002: ["19999","20002","39999","40002","59999"]
  3. 00003: ["19998","20003","39998","40003","59998"]
  4. 00004: ["19997","20004","39997","40004","59997"]
  5. 00005: ["19996","20005","39996","40005","59996"]
  6. .
  7. .
  8. .
  9. 09995: ["10006","29995","30006","49995","50006"]
  10. 09996: ["10005","29996","30005","49996","50005"]
  11. 09997: ["10004","29997","30004","49997","50004"]
  12. 09998: ["10003","29998","30003","49998","50003"]
  13. 09999: ["10002","29999","30002","49999","50002"]
  14. 10000: ["10001","30000","30001","50000","50001"]

因为我不能用已经卖出的一万张票。
第一列从20,000开始,下降到10,001;第二列从20,001开始,结束于30,000,依此类推。
我已经有了这个代码,它是这样工作的。

  1. function randomGen($min, $max, $quantity) {
  2. $numbers = range($min, $max);
  3. $find = array("[","]");
  4. $replace = array("","");
  5. $cadena = str_replace($find, $replace, json_encode(array_slice($numbers, 0, $quantity)));
  6. return $cadena;
  7. }
  8. $minCol1 = 20000;
  9. $maxCol1 = 10001;
  10. $minCol2 = 20001;
  11. $maxCol2 = 30000;
  12. $minCol3 = 40000;
  13. $maxCol3 = 30001;
  14. $minCol4 = 40001;
  15. $maxCol4 = 50000;
  16. $minCol5 = 60000;
  17. $maxCol5 = 50001;
  18. for($i = 1; $i<=10000; $i++){
  19. $oportunidades = randomGen($minCol1,$maxCol1,1).",".randomGen($minCol2,$maxCol2,1).",".randomGen($minCol3,$maxCol3,1).",".randomGen($minCol4,$maxCol4,1).",".randomGen($minCol5,$maxCol5,1);
  20. $str_arr = explode (",", $oportunidades);
  21. ?>
  22. <li>
  23. <span data-oportunidades='<? echo(json_encode($str_arr));?>'>
  24. <?=str_pad($i, 5, "0", STR_PAD_LEFT);?>
  25. </span>
  26. </li>
  27. <?
  28. $minCol1 = $minCol1 -1;
  29. $maxCol1 = $minCol1 -1;
  30. $minCol2 = $minCol2 +1;
  31. $maxCol2 = $minCol2 +1;
  32. $minCol3 = $minCol3 -1;
  33. $maxCol3 = $minCol3 -1;
  34. $minCol4 = $minCol4 +1;
  35. $maxCol4 = $minCol4 +1;
  36. $minCol5 = $minCol5 -1;
  37. $maxCol5 = $minCol5 -1;
  38. }

但我很肯定这不是解决这个问题的正确方法。
有人知道怎么做吗?
太感谢你了!

0pizxfdo

0pizxfdo1#

也许你想要这样的东西:

  1. // This is an example function to generate initial tickets
  2. function genTickets(int $num): array
  3. {
  4. $tickets = [];
  5. for ($i = 0; $i < $num; $i++) {
  6. $tickets[] = $i + 1;
  7. }
  8. return $tickets;
  9. }
  10. function getTicketsSlice(array $tickets, bool $ascending, int $count, int $offset): array
  11. {
  12. $slice = array_slice($tickets, $offset, $count);
  13. if (!$ascending) {
  14. return array_reverse($slice);
  15. }
  16. return $slice;
  17. }
  18. function getSoldTicketsWithOpportunities(array $tickets, int $soldTicketsCnt): array
  19. {
  20. $opportunities = (int)floor((count($tickets) - $soldTicketsCnt) / $soldTicketsCnt);
  21. $soldTickets = [];
  22. for ($i = 0; $i < $opportunities; $i++) {
  23. $ascending = $i % 2 !== 0;
  24. foreach (getTicketsSlice($tickets, $ascending, $soldTicketsCnt, ($i + 1) * $soldTicketsCnt) as $idx => $sliceItem) {
  25. $soldTickets[$idx][] = $sliceItem;
  26. }
  27. }
  28. return $soldTickets;
  29. }
  30. $totalTicketsCnt = 60000;
  31. $soldTicketsCnt = 10000;
  32. $tickets = genTickets($totalTicketsCnt);
  33. $soldTickets = getSoldTicketsWithOpportunities($tickets, $soldTicketsCnt);
  34. foreach ($soldTickets as $ticketId => $opportunities) {
  35. ?>
  36. <li>
  37. <span data-oportunidades='<?= json_encode($opportunities, JSON_THROW_ON_ERROR) ?>'>
  38. <?= str_pad((string)($ticketId + 1), 5, "0", STR_PAD_LEFT) ?>
  39. </span>
  40. </li>
  41. <?php
  42. }

或者以不那么自然而然的方式:

  1. // This is an example function to generate initial tickets
  2. function genTickets(int $num): array
  3. {
  4. $tickets = [];
  5. for ($i = 0; $i < $num; $i++) {
  6. $tickets[] = $i + 1;
  7. }
  8. return $tickets;
  9. }
  10. function getTicketsSlice(array $tickets, bool $ascending, int $count, int $offset): array
  11. {
  12. $slice = array_slice($tickets, $offset, $count);
  13. if (!$ascending) {
  14. return array_reverse($slice);
  15. }
  16. return $slice;
  17. }
  18. $totalTicketsCnt = 60000;
  19. $soldTicketsCnt = 10000;
  20. $tickets = genTickets($totalTicketsCnt);
  21. // Get tickets slice from 10000 to 20000 in reverse order
  22. foreach (getTicketsSlice($tickets, false, $soldTicketsCnt, 10000) as $sliceItem) {
  23. $soldTickets[] = [$sliceItem];
  24. }
  25. // Apply next opportunities in ascending order
  26. foreach (getTicketsSlice($tickets, true, $soldTicketsCnt, 20000) as $idx => $sliceItem) {
  27. $soldTickets[$idx][] = $sliceItem;
  28. }
  29. // Apply next opportunities in descending order
  30. foreach (getTicketsSlice($tickets, false, $soldTicketsCnt, 30000) as $idx => $sliceItem) {
  31. $soldTickets[$idx][] = $sliceItem;
  32. }
  33. // Apply next opportunities in ascending order
  34. foreach (getTicketsSlice($tickets, true, $soldTicketsCnt, 40000) as $idx => $sliceItem) {
  35. $soldTickets[$idx][] = $sliceItem;
  36. }
  37. // Apply next opportunities in descending order
  38. foreach (getTicketsSlice($tickets, false, $soldTicketsCnt, 50000) as $idx => $sliceItem) {
  39. $soldTickets[$idx][] = $sliceItem;
  40. }
  41. foreach ($soldTickets as $ticketId => $opportunities) {
  42. ?>
  43. <li>
  44. <span data-oportunidades='<?= json_encode($opportunities, JSON_THROW_ON_ERROR) ?>'>
  45. <?= str_pad((string)($ticketId + 1), 5, "0", STR_PAD_LEFT) ?>
  46. </span>
  47. </li>
  48. <?php
  49. }
展开查看全部

相关问题