这不会进行任何数字验证或货币格式化,但它确实很好地压缩了代码段。我也不确定您想要的结果是哪个数字,所以我返回三个值:税率、税额和减去税后的价格。
我选择使用数组函数而不是 if/else 语句块。(演示)
方法 #1:2 行和返回
function tax($value) {
$tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0];
$rate=key(array_filter($tiers,function($threshold)use($value){return $value>$threshold;}));
return [$rate,$value*$rate,$value-$value*$rate];
}
方法 #2:4 行和一个返回,但更有效
function tax($value) {
$tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0];
foreach($tiers as $rate=>$threshold){
if($value>$threshold){break;} // $rate will be preserved outside of the loop
}
return [$rate,$value*$rate,$value-$value*$rate];
}
像这样调用函数:var_export(tax(126999));
将输出:
array (
0 => '.12',
1 => 1523988.0,
2 => 11175912.0,
)
由于您将“代码简洁”置于“代码效率”之前,我会推荐方法#1。因为这个任务非常小/轻,我认为没有人会注意到通过微优化获得的任何收益。
ps 如果您没有在同一个脚本中多次执行此操作和/或不想要函数调用,您可以$rate
使用以下方式声明:
$tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0];
$rate=key(array_filter($tiers,function($threshold)use($value){return $value>$threshold;}));
或者
$tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0];
foreach($tiers as $rate=>$threshold){
if($value>$threshold){break;}
}