分类 PHP 下的文章

普通写法

function get_chance($chance = [
    '和谐' => 3000,
    '爱国' => 5000,
    '敬业' => 110,
    '友善' => 1000,
    '富强' => 3000,
])
{
    $cardRange = [];
    $num = rand(0, array_sum(array_values($chance)));
    $total = 0;
    foreach ($chance as $key => $value) {
        $totalBefore = $total;
        $total += $value;
        if ($num >= $totalBefore && $num < $total) {
            return $key;
        }
        $cardRange[$key] = [$totalBefore, $total];
    }
    return $key;
}

在swoole环境中的写法, 兼容所有环境

function get_chance($chance = [
    '和谐' => 3000,
    '爱国' => 5000,
    '敬业' => 110,
    '友善' => 1000,
    '富强' => 3000,
])
{
    // 在协程中避免rand一段时间内值一致的问题
    $cardRange = [];
    $total = array_sum(array_values($chance));
    // $randValue = substr(explode(' ', microtime())[0], 0, 8);
    $randValue = strrev(substr(explode(' ', microtime())[0], 2, 6)) / 1000000;
    $rangeBefore = 0;
    $total2 = 0;
    foreach ($chance as $key => $value) {
        $total2 += $value;
        $rangeAfter = $total2 / $total;
        if ($randValue >= $rangeBefore && $randValue < $rangeAfter) {
            return $key;
        }
        $rangeBefore = $rangeAfter;
    }
    return $key;
}

校验数据和预期值的差异量

$t = [
    '记' => 300,
    '得' => 900,
    '我' => 150,
];
$r = [
    '记' => 0,
    '得' => 0,
    '我' => 0,
];
for ($k = 0; $k <= 10000; $k++) {
    $r[get_chance($t)]++;
}
var_dump($r);

  • 数组部分
将原数组倒序 array_reverse()
  • 移除数值无意义的0
$num = '0.123456789012345678900000000000';
echo rtrim(rtrim($num, '0'), '.');

function numToWord($num)
{
    $chiNum = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
    $chiNum['-'] = '负';
    $chiNum['+'] = '正';
    $chiUni = array('', '十', '百', '千', '万', '亿', '十', '百', '千');
    $num_str = (string)$num;
    $count = strlen($num_str);
    $last_flag = true; //上一个 是否为0
    $zero_flag = true; //是否第一个
    $temp_num = null; //临时数字
    $chiStr = '';//拼接结果
    if ($count == 2) {//两位数
        $temp_num = $num_str[0];
        $chiStr = $temp_num == 1 ? $chiUni[1] : $chiNum[$temp_num] . $chiUni[1];
        $temp_num = $num_str[1];
        $chiStr .= $temp_num == 0 ? '' : $chiNum[$temp_num];
    } else if ($count > 2) {
        $index = 0;
        for ($i = $count - 1; $i >= 0; $i--) {
            $temp_num = $num_str[$i];
            if ($temp_num == 0) {
                if (!$zero_flag && !$last_flag) {
                    $chiStr = $chiNum[$temp_num] . $chiStr;
                    $last_flag = true;
                }
            } else {
                $chiStr = $chiNum[$temp_num] . $chiUni[$index % 9] . $chiStr;
                $zero_flag = false;
                $last_flag = false;
            }
            $index++;
        }
    } else {
        $chiStr = $chiNum[$num_str[0]];
    }
    return $chiStr;
}
$num = -44;
echo numToWord($num);

输出

负四十四