就像这个网站一样,我目前的项目有声誉,而且在我正在编写的剧本中,我需要计算两个用户之间的比例'声誉。
$attacker->ratio = $defender->rep / $attacker->rep;
$defender->ratio = $attacker->rep / $defender->rep;
在这样做的过程中,我偶尔可能会将除数的声誉归为0,这很糟糕!
显然我可以添加几张支票,但我想知道是否还没有发明更漂亮的解决方案,比如@
这样的问题,但我知道这不是一个好主意。
答案 0 :(得分:15)
假设正数有效,则确保最低的除数值为1。
$defender->ratio = $attacker->rep / max($defender->rep, 1);
答案 1 :(得分:9)
这就是我的方式。
$defender->ratio = ($defender->rep === 0) ? 0 : $attacker->rep / $defender->rep;
答案 2 :(得分:2)
如果您使用的是PHP> 5.3你可以使用三元运算符?:
$attacker->ratio = $defender->rep / ($attacker->rep ?: 1);
$defender->ratio = $attacker->rep / ($defender->rep ?: 1);
这意味着如果运算符之前的变量为false或为空,则返回之后的值将返回,否则返回第一个值
以下示例:
$attacker->rep = 0;
$defender->rep = 55;
$attacker->ratio = $defender->rep / ($attacker->rep ?: 1); // returns 55 / 1 = 55
$defender->ratio = $attacker->rep / ($defender->rep ?: 1); // returns 0 / 55 = 0
答案 3 :(得分:1)
这样的东西?
if($defender->rep != 0){
$attacker->ratio = $defender->rep / $attacker->rep;
}
答案 4 :(得分:1)
使用三元运算符检查分频器是否为零。
$attacker->ratio = $attacker->rep > 0 ? $defender->rep / $attacker->rep : 1;
$defender->ratio = $defender->rep > 0 ? $attacker->rep / $defender->rep : 1;
使用您想要的任何内容而不是默认值1
。
答案 5 :(得分:1)
基于其他答案,我假设你只更新比例,如果它不是零(记住你要求优雅不清晰):
if( !empty($attacker->rep) ) {
$attacker->ratio = $defender->rep / $attacker->rep;
}
PHP将0视为空。
答案 6 :(得分:1)
我不建议人为改变任何用户的声誉,仅仅是为了使数学工作。相反,你可以这样做:
function calc_rep_ratio($self, other)
{
if ($self->rep != 0) {
return $other->rep / $self->rep;
} else {
return NAN;
}
}
然后使用函数
$defender->ratio = calc_rep_ratio($defender, $attacker);
$attacker->ratio = calc_rep_ratio($attacker, $defender);
在演示文稿中,您可以检查号码
if (is_nan($user->ratio)) {
echo 'No ratio available';
} else {
echo $user->ratio;
}