我真的很感谢这里的帮助...我有一系列的费率,例如
[
[
'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 等。
所以这是增量的事情。我们将从一开始就
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);