看完你就会的php抽奖小案例 还在等什么?

<?php

    // 准备奖品
    // weight代表奖品权重  权重越大被抽到的可能性也就越大
    // 可以在后台进行设置
    // 如果不希望该奖品被抽到  权重可以给设置成0
    $rewardOptions = array(
        array('id' => 1, 'name' => '橙武', 'weight' => 1), 
        array('id' => 2, 'name' => '紫武', 'weight' => 1), 
        array('id' => 3, 'name' => '蓝武', 'weight' => 1), 
        array('id' => 4, 'name' => '绿武', 'weight' => 1), 
        array('id' => 5, 'name' => '白武', 'weight' => 1), 
    );

    // 获取抽到的奖品ID
    $rewardId = getRewardId($rewardOptions);
    // 得到奖品ID  进行相关业务操作
    // .....
    // 展示对应的奖品
    echo $rewardOptions[$rewardId - 1]['name'];


    /**
     * [getRewardId 抽奖方法(必定能抽中奖品)]
     * 这个算法的核心点就在于看获得的随机数是否落在某个权重范围区间
     * 如果是则直接可以取出该奖品
     * 如果不是则将总权重中去除本次循环的权重
     * 总权重一次一次减小  最后一个总权重  必定等于最后一次循环的奖品权重
     * 所以获得的随机数必定也在这个范围内 奖品必然会获得
     * @param  [type] $arr [奖品数组]
     * @param  [type] $start [起始权重 可用来做猫腻 
     * 如果只想让廉价的奖品被抽中 可以将该值设置为廉价商品的权重值]
     * @return [type] $id  [抽到的奖品]
     */
    function getRewardId($arr, $start = 1) {
        // 计算总权重
        $totalWeight = array_sum(array_column($arr, 'weight'));
        
        foreach($arr as $k => $v) {
            // 获取一个总权重内的随机数
            $random = mt_rand($start, $totalWeight);
            if($random <= $v['weight']) {
                return $v['id'];
            } else {
                $totalWeight -= $v['weight'];
            }
        }
    }

代码果然需要理解记忆 死记硬背是永远消化不了的!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容