<?php /** * $prize_arr 参与抽奖人员数据 * id: 一般是成员ID * name 姓名 * v 得奖概率 ***/ $prize_arr = array( '0' => array('id'=>1,'name'=>'小王','v'=>1), '1' => array('id'=>2,'name'=>'小李','v'=>5), '2' => array('id'=>3,'name'=>'小张','v'=>99), '3' => array('id'=>3,'name'=>'小赵','v'=>99), '4' => array('id'=>3,'name'=>'小张','v'=>99) ); foreach ($prize_arr as $key => $val) { $arr[$key] = $val['v']; } $total_num = count($prize_arr); //设定得中奖人数量 $temp_rest=array(); for($i=0;$i<$total_num;$i++) { $rid = get_rand($arr,true); //根据概率获取人员ID $temp_rest[]= $prize_arr[$rid]; //中奖项 unset($prize_arr[$rid]); unset($arr[$rid]); } print_r($temp_rest);//得出结果 /**** * 得出当前中奖人 * $is_status是否开启概率为100必中: 默认不开启 ***/ function get_rand($proArr,$is_status = false) { $result = ''; if($is_status){ $rest = get_100($proArr); //调用获取100命中 }else{ $rest =''; } if(empty($rest) || !isset($rest)){ //概率数组的总概率精度 $proSum = array_sum($proArr); //概率数组循环 foreach ($proArr as $key => $proCur) { $randNum = mt_rand(1, $proSum); if ($randNum <= $proCur) { $result = $key; break; } else { $proSum -= $proCur; } } }else{ $result = $rest; } unset ($proArr); return $result; } function get_100($arr_mast){ $result = ''; foreach ($arr_mast as $key => $value_mast) { if($value_mast== 100){ $result = $key; break; } } unset ($arr_mast); return $result; } ?>