【发布时间】:2020-07-24 09:15:49
【问题描述】:
我正在处理yii2。我想明智地计算电费单。为此,我已经在表格中插入了平板及其各自的费率。现在我想计算一下。
我的单位是128.82,下面是我的平板和他们的费率。
我可以使用以下查询来执行平板
$mData = \Yii::$app->db->createCommand("SELECT s.`slab_start`, s.`slab_end`, s.`rate`, r.`cust_id`
FROM `mdc_tariff_slabs` s
INNER JOIN `mdc_meter_cust_rel` r ON s.`t_id` = r.`tariff_id`
WHERE r.`cust_id` = $consumer_no")->queryAll();
array(3) { [0]=> array(3) { ["slab_start"]=> string(1) "1" ["slab_end"]=> string(3) "100" ["rate"]=> string(2) "10" } [1]=> array(3) { ["slab_start"]=> string(3) "101" ["slab_end"]=> string(3) "150" ["rate"]=> string(2) "12" } [2]=> array(3) { ["slab_start"]=> string(3) "151" ["slab_end"]=> NULL ["rate"]=> string(2) "14" } }
注意:未来平板可能会有所不同
我试过下面的代码,按照我的要求设置slabs并尝试拿到账单
public static function calcBill($units)
{
if($units < 100){
$bill = $units*10;
}elseif($units > 100 && $units <=150){
$temp = 100*10;
$remaining_units = $units - 100;
$bill = $temp + ($remaining_units *12);
}else{
$temp = (100*10)+ (100*12);
$remaining_units = $units - 150;
$bill = $temp + ($remaining_units *14);
}
echo $bill;
die();
}
账单是1345.84。
现在我要做的是也传递平板,而不是硬编码它们。我觉得有点难。
更新 1
我有 3 个平板/单位的限制。每个平板都有自己的费率。费率用于计算账单。下面是场景。
- 如果单位
- 如果单位 > 100 &&
- 如果单位 > 150,则收取 14 卢比/单位
在我的数组中,除了最后一个只有slab_start 和rate 之外,我拥有所有三个值。
通过硬编码板坯和费率,我可以计算账单,但我想在使用数组时进行计算。
所以代码可能看起来像
if($units < slab_end){
$bill = $units*rate;
}elseif($units > slab_start && $units <=slab_end){<=slab_end
$temp = prev_slab_start *rate;
$remaining_units = $units - prev_slab;
$bill = $temp + ($remaining_units *rate);
}else{
$temp = (prev_slab*10)+ (prev_slab*12);
$remaining_units = $units - slab_start;
$bill = $temp + ($remaining_units *14);
}
我不知道上面的逻辑是否正确。
注意:板坯范围和数量可能会有所变化。所以我想要一个通用的函数来做必要的事情
更新 2
按照提到的解决方案。
$array = ArrayHelper::map($mData, 'slab_end', 'rate');
var_dump($array);
die();
上面给了我
array(3) { [100]=> string(2) "10" [150]=> string(2) "12" [""]=> string(2) "14" }
然后我添加了一个函数
public function billCalc($input, $slabs)
{
$result = [];
$bill = 0;
$previous_slab = 0;
foreach($slabs as $slab => $rate)
{
// calculate distance between current and previous slab
$slab_distance = $slab - $previous_slab;
// if current remainder of input value is >= distance, add distance to result,
// and subtract distance from remainder of input
if( $input >= $slab_distance )
{
$result[] = $slab_distance;
$bill += $slab_distance * $rate;
$input -= $slab_distance;
}// otherwise, add remainder as last item of result, and break out of the loop here
else
{
$result[] = $input;
$bill += $input * $rate;
break;
}
$previous_slab = $slab;
}
var_dump($result, $bill);
exit();
}
现在我面临一个问题。当输入小于150 时,结果完全没问题,但是当它大于或等于150 时,我遇到了错误
遇到一个非数字值
它给了我这个错误
$slab_distance = $slab - $previous_slab;
任何帮助将不胜感激。
【问题讨论】:
-
好像我不只是在你之前的问题下给你一个解决方案,你甚至不到一个小时前就问过这个问题......? stackoverflow.com/questions/63069762/php-separate-string
-
根据下面的讨论stackoverflow.com/a/63070039/1427878,显然这里的费率应该有所不同,或者至少是一个更复杂的计算/公式,但这仍然缺乏 proper i> 解释您的费率应该如何计入计算,恕我直言。请说明使用你的单词,而不是说“这里是代码,你自己想办法”。
标签: php yii2 yii2-advanced-app billing