如何生成未被用户选用的6个唯一彩票号码数组?
问题描述
现有01至36的号码池,需生成包含6个唯一号码的数组,且这些号码从未出现在user.json的lottery_number字段中。
号码池定义:
$arr = array("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36");
user.json示例数据:
$userdata = [ { "username": "ananda", "lottery_number": [ "09", "15", "17", "22", "25", "27" ], "status": "1", "id": 1 }, { "username": "jaka0", "lottery_number": [ "01", "08", "09", "25", "16", "03" ], "status": "0", "id": 2 }, { "username": "jaka1", "lottery_number": [ "09", "07", "06", "24", "12", "21" ], "status": "0", "id": 3 } ];
原尝试逻辑(效果不佳):
$arr = array("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36"); $totalarr = []; $totalarr = array_merge($totalarr ,$arr); foreach($userdata as $user) { $totalarr = array_merge($totalarr ,$user['lottery_number']); } $totalarr = array_merge($totalarr ,$arr); $r = array_filter(array_count_values($totalarr ), function($v) { return $v > 1; }); $key = array_keys($r, min($r));
正确实现逻辑
核心思路是先收集所有已被用户选过的号码,再从号码池中筛选出从未被选过的号码,最后从中随机选6个唯一号码。
步骤分解
- 遍历
userdata,提取所有lottery_number字段的号码,合并成去重后的已选号码集合。 - 计算号码池与已选号码的差集,得到所有未被选过的候选号码。
- 验证候选号码数量是否满足6个(按场景36总号码-最多18个已选,剩余18个足够)。
- 随机打乱候选号码后取前6个,保证结果随机性。
PHP代码实现
// 定义号码池 $numberPool = array("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36"); // 收集所有已选号码并去重 $selectedNumbers = []; foreach ($userdata as $user) { $selectedNumbers = array_merge($selectedNumbers, $user['lottery_number']); } $selectedNumbers = array_unique($selectedNumbers); // 筛选未被选过的号码 $availableNumbers = array_diff($numberPool, $selectedNumbers); // 随机选取6个唯一号码 shuffle($availableNumbers); $generatedNumbers = array_slice($availableNumbers, 0, 6); // 输出结果 print_r($generatedNumbers);
代码说明
array_unique:确保已选号码集合无重复值,避免差集计算出错。array_diff:直接得到号码池中未被选过的所有号码,比统计出现次数更高效直接。shuffle+array_slice:打乱候选号码顺序后取前6个,保证结果的随机性和唯一性。
内容的提问来源于stack exchange,提问作者Hendra
相关产品推荐
相关产品推荐

