PHP:避免除零的优雅方式

php*_*_qq 8 php

就像这个网站一样,我当前的项目有声誉,在我正在编写的脚本中,我需要计算两个用户声誉之间的比例.

$attacker->ratio = $defender->rep / $attacker->rep;
$defender->ratio = $attacker->rep / $defender->rep;
Run Code Online (Sandbox Code Playgroud)

在这样做的过程中,我偶尔可能会将除数的声誉归为0,这很糟糕!

显然我可以添加几个支票,但我想知道是否还没有发明更漂亮的解决方案,比如@盈方,但我知道这不是一个好主意.

Rya*_*ent 22

假设正数有效,则确保最低的除数值为1.

$defender->ratio = $attacker->rep / max($defender->rep, 1);
Run Code Online (Sandbox Code Playgroud)

  • 如果$ defender-> rep在0和1之间结束怎么办?如果您拥有将防御者代表推入介于'0'和'1'之间的范围的修饰语,您将遇到错误。当然,这仅在您确定rep值只能具有整数值的情况下才有效。 (2认同)

mat*_*iit 12

这就是我这样做的方式.

$defender->ratio = ($defender->rep === 0) ? 0 : $attacker->rep / $defender->rep;
Run Code Online (Sandbox Code Playgroud)

  • 你可能讨厌它,但是这种语法专门用来解决像op那样的问题.如果做得对 - 你不需要任何额外的if语句. (3认同)
  • 我讨厌这样的衬垫。该语法使处理特殊情况变得不可读,并且之后您仍然需要一个 `if` 条件。 (2认同)
  • 这很短,但很快就会变得混乱。 (2认同)
  • 在上下文中解决他的问题.在这里显示"0"好吗?我要告诉用户"没有足够的信息来比较"更好. (2认同)

Red*_*r0w 6

如果您使用的是PHP> 5.3,则可以使用三元运算符 ?:

$attacker->ratio = $defender->rep / ($attacker->rep ?: 1);
$defender->ratio = $attacker->rep / ($defender->rep ?: 1);
Run Code Online (Sandbox Code Playgroud)

这意味着如果运算符之前的变量为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
Run Code Online (Sandbox Code Playgroud)