【问题标题】:Slab wise electricity bill calculation in Yii2 [duplicate]Yii2中的平板电费计算[重复]
【发布时间】: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_startrate 之外,我拥有所有三个值。

通过硬编码板坯和费率,我可以计算账单,但我想在使用数组时进行计算。

所以代码可能看起来像

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


【解决方案1】:

因此,您只需要将每个平板覆盖的数量(“单位”)乘以速率 - 所以我将创建一个数组,其中平板末端为 key,速率为value - 然后您可以使用扩展的 foreach 语法简单地循环它,并随时访问与平板对应的速率。

my answer to the previous question 上展开,看起来像这样:

$input = '128.82';
$slabs = [100 => 10, 150 => 12, PHP_INT_MAX => 14];

$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);

结果:

array (size=2)
  0 => int 100
  1 => float 28.82

float 1345.84

我的方法在这里再次只使用了上板边界——你在数据库的最后一条记录中没有一个,所以我在这里用 PHP_INT_MAX 代替那个 NULL 值。考虑到这一点,当您从数据库内容创建该数组时,我希望这不是挑战。

(如果您在这里只需要 1345.84 作为结果,而不是显示各个板块分布的数组,那么您可以删除所有包含 $result 的行。)

【讨论】:

  • 如何将array(3) { [0]=&gt; array(3) { ["slab_start"]=&gt; string(1) "1" ["slab_end"]=&gt; string(3) "100" ["rate"]=&gt; string(2) "10" } [1]=&gt; array(3) { ["slab_start"]=&gt; string(3) "101" ["slab_end"]=&gt; string(3) "150" ["rate"]=&gt; string(2) "12" } [2]=&gt; array(3) { ["slab_start"]=&gt; string(3) "151" ["slab_end"]=&gt; NULL ["rate"]=&gt; string(2) "14" } } 转换为[100 =&gt; 10, 150 =&gt; 12, PHP_INT_MAX =&gt; 14];
  • 另外,它如何工作N 平板数和费率?提到最后一个slab只有slab_startrate
  • 我遇到了一个问题。请检查我的update 2
  • 空字符串和PHP_INT_MAX 不是一回事。我们希望能够在此处使用这些键值进行数学运算,因此您不能只使用 '' 作为此处的键。
  • 我怎样才能将PHP_INT_MAX 放入我的数组中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 2014-04-20
  • 2015-11-02
  • 1970-01-01
相关资源
最近更新 更多