Dies wird keine Zahlenüberprüfung oder Währungsformatierung machen, aber das Snippet wird ziemlich gut verdichtet. Ich bin mir auch nicht sicher, welche Zahl Sie haben wollten, deshalb gebe ich drei Werte zurück: den Satz, den Betrag der Steuer und den Preis abzüglich der Steuer.
Anstatt ein Block von if/else-Anweisungen, habe ich gewählt, Array-Funktionen zu verwenden. (Demo)
Methode 1: 2-Linien und eine Rückkehr
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];
}
Methode # 2: 4-Linien und eine Rückkehr, aber effizientere
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];
}
Aufruf der Funktion wie folgt : var_export(tax(126999));
AUSGABE:
array (
0 => '.12',
1 => 1523988.0,
2 => 11175912.0,
)
Da Sie "Code Kürze" vor "Code Effizienz" setzen, würde ich Methode # 1 empfehlen. Da diese Aufgabe so klein und leicht ist, glaube ich nicht, dass irgendjemand irgendwelche Vorteile durch Mikrooptimierung bemerken wird.
p.s. Wenn Sie nicht tun, sind diese mehrmals im selben Skript und/oder keine Funktionsaufruf möchten, können Sie $rate
erklären nur durch diese Verwendung:
$tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0];
$rate=key(array_filter($tiers,function($threshold)use($value){return $value>$threshold;}));
oder
$tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0];
foreach($tiers as $rate=>$threshold){
if($value>$threshold){break;}
}
Ich bin interessiert um zu sehen, ob ich mir etwas Konkreteres ausdenken kann, aber ich muss etwas haben, um es zu vergleichen! –
Was ist das erwartete Ergebnis, wenn der Benutzer 130.000 eingibt? Ich würde erwarten, 125.000 * 0.00 + (130.000 - 125.000) * .02 = 100'. – Arjan