使用 while 循环根据用户输入收集费率

问题描述 投票:0回答:1

我真的很感谢这里的帮助...我有一系列的费率,例如

[
  [
    'rate_id' => 1,
    'after' => 0,
    'units' => 0,
    'rate' => 0
  ],
  [
    'rate_id' => 2,
    'after' => 8,
    'units' => 0,
    'rate' => 12
  ],
  [
    'rate_id' => 3,
    'after' => 12,
    'units' => 0,
    'rate' => 15
  ]
]
]

我需要输入一个输入的

total time
,例如假设 1 天 15.5 小时,循环遍历费率并将 15 小时拆分到相应的数组键中,因此第一个数组项应包含前 8 小时,第二个包含 4 小时,最后一个包含 3.5 小时。

上面的数组是费率表的数据,因此每个“之后”都是加班费率生效的时间。

请提供任何帮助,我真的很感激,因为我正在努力使其在小数位上准确工作。

到目前为止,我已经尝试过执行 php do/while 循环,这是迄今为止我的 laravel 应用程序中的代码。

$totalTime = $item->units;

                $rates = $item->timesheet->rates()
                    ->orderBy('after', 'desc')
                    ->get()
                    ->keyBy('after')
                    ->map(function($item) {
                        return [
                            'units' => 0,
                            'rate_id' => $item['id']
                        ];
                    })->toArray();

                do {
                    foreach ($rates as $after => $rate) {
                        if ($totalTime >= $after) {
                            $rates[$after]['units'] = $rates[$after]['units'] + 1;
                            break;
                        }
                    }
                    $totalTime -= 1;
                } while ($totalTime >= 1);

                $rates = collect($rates)->filter(function ($item, $key) {
                    return $item['units'] > 0;
                });

到目前为止,我认为这是可行的,但如果

$totalTime
是小数位,则它不起作用,将其向上/向下舍入到最接近的小数,因为我们只递减 1,而不是 0.1,但如果我递减当它达到 0.1 时,它也无法正常工作,因为当我们低于 0 时,它开始执行 0.9、0.8、0.7 等。

php laravel
1个回答
0
投票

所以这是增量的事情。我们将从一开始就

for
,充实时间,同时从
$totalTime

减少用量
<?php
$arr = [
    [
        'rate_id' => 1,
        'after' => 0,
        'units' => 0,
        'rate' => 0
    ],
    [
        'rate_id' => 2,
        'after' => 8,
        'units' => 0,
        'rate' => 12
    ],
    [
        'rate_id' => 3,
        'after' => 12,
        'units' => 0,
        'rate' => 15
    ]
];

$totalTime = 15.5;
for ($i = 0; $i < count($arr) - 1; $i++) {
    $shift = $arr[$i + 1]['after'] - $arr[$i]['after'];
    $worked = min($totalTime, $shift);
    $arr[$i]['units'] = $worked;
    $totalTime -= $worked;
}
if (count($arr)) {
    $arr[count($arr) - 1]['units'] = $totalTime;
}

print_r($arr);

© www.soinside.com 2019 - 2024. All rights reserved.