我需要根据一系列重量规则找到运输箱子的成本,类似于这样:
$rules = [
'1' => '1.2',
'5-10' => '6.25',
'10-15' => '9.2',
'15-20' => '10.9',
];
因此,根据这个数组,一个重47磅的盒子的运输成本为10.90 + 10.90 + 6.25 = 28.05美元.
这是因为47将消耗两倍的范围(15-20)和一倍的范围(5-10).(
表示>
方程符号,而]
表示<=
方程符号.
首先,为了简单起见,我创建了一个中间数组(每个范围规则的上限),就像这样(1没有上/下限,但很容易排除):
$tiers = [
20,
15,
10,
1,
];
然后我try 以类似于因式分解过程的方式将初始权重分配给该array.所以一开始我完全忽略了下限,拿了一个重量,即.37.75磅.然后,使用以下代码,我生成每个权重层的"因子分解"数组:
print_r( distribute( 37.75 );
function distribute( $weight = 0 ) {
$tiers = [1, 10, 15, 20];
rsort( $tiers );
foreach ( $tiers as $tier ) {
$counters[$tier] = 0;
}
foreach ( $tiers as $tier ) {
$quotient = $weight / $tier;
$floored = floor( $quotient );
$remaining = $weight - $floored * $tier;
if ( $quotient >= 1 && $remaining > 1 ) {
$counters[$tier] = $floored;
$weight = $remaining;
} else if ( $tier == 1 ) {
$counters[$tier] = ( $floored + 1 );
$weight = $weight - ( $floored + 1 ) * $tier;
}
}
return $counters;
}
这方便地产生了这样的输出:
Array (
[20] => 1
[15] => 1
[10] => 0
[1] => 3
)
然后,我try 了同样的权重为38的代码,并意识到我的第一个错误……边缘情况有一些问题,我还无法弄清楚,38仍然会在1层规则中增加+1
.
然后,我try 了47.75磅,发现了第二个错误……正如我所说,为了简单起见,我使用了上限,这会扰乱权重的"因式分解".因此,对于47.75磅,上面的代码会产生这样的输出:
Array (
[20] => 2
[15] => 0
[10] => 0
[1] => 8
)
这是完全错误的,因为1层不能消费8次,因为8(准确地说是7.99)属于(5-10]范围.
总而言之,不幸的是,我的方法在很多方面都存在缺陷.有人能帮我找出正确的代码来处理这个问题吗?