当前位置:Home > PHP > 红包生成函数(微信抢红包)

红包生成函数(微信抢红包)

发布时间:2016-02-02   浏览次数:1654

最近自己开发了一个类似微信抢红包的功能,在网上找了很多红包生成的函数,但都不是那么完美,于是自己动手写了一个。

( 阿荣原创^_^ )

//$money 是发红包的总金额, $num 红包生成的数量

/**
 * 生成单个红包
 * @param float $money 红包金额(单位:元)
 * @param int $num 红包个数
 * @return float 单个红包的金额
 */
function makeSingleLuckMoney($money, $num) {
    if ($num == 1) {
        return round($money, 2);
    }
    $avg = $money / $num;
    if ($avg < 0.1) {
        $min = 0.01;
    } else {
        $min = $avg / 4;
    }
    $useMoney = $money - $num * $min;
    if (($useMoney == 0) || ($useMoney < 0.02)) {
        return $min;
    }
    $arr = array();
    $c = $num;
    for ($i = 0; $i < $c; $i++) {
        $useMoney = $money - $num * $min;
        $tmp = rand(1, $useMoney * 100) / 100;
        $max = $useMoney / 2;
        if ($tmp > $max) {
            $n = $min + $max;
        } else {
            $n = $min + $tmp;
        }
        $tmpMoney = floor($n * 100) / 100;
        $money = $money - $tmpMoney;
        $num--;
        $arr[] = $tmpMoney;
    }
    $keyNum = count($arr);
    if ($keyNum > 1) {
        $key = rand(0, $keyNum - 1);
    } else {
        $key = 0;
    }
    return floor($arr[$key] * 100) / 100;
}
/**
 * 生成所有红包
 * @param float $money 红包金额(单位:元)
 * @param int $num 红包个数
 * @return array 所有单个红包金额组成的数组
 */
function makeAllLuckMoney($money, $num) {
    $leftMoney = $money;
    $leftNum = $num;
    $resultArr = array();
    for ($i = 0; $i < $num; $i++) {
        $resultArr[] = $luckMoney = makeSingleLuckMoney($leftMoney, $leftNum);
        $leftMoney = $leftMoney - $luckMoney;
        $leftNum--;
    }
    shuffle($resultArr);
    return $resultArr;
}

//example
print_r(makeAllLuckMoney(10, 7));