PHP 编码帮助创建一个引用其他数组和数组中项目总和的数组



我正在努力为此创建一些PHP代码,感谢您的帮助。这些数组包含一个人跑步的拆分和圈数。

$laps显示,有人在跑步 200 米处拍了拍手表,然后在第一圈后 400 米,然后在那圈之后 600 米等等......

$splits显示每1609米的人跑步就会发生一次自动分裂。有与$splits直接相关的数据($splitGAP(。所以第一个 1609m 的 GAP 值为 0.5,第二个 1609m 的 GAP 值为 -0.1,依此类推......

以$laps为单位的距离之和等于以$splits为单位的距离之和。

$laps = array(200,400,600,800,1600,800,600,400,200,836);
$splits = array(1609,1609,1609,1609);
$splitGAP= array(0.5,-0.1,0.7,-0.6);

我想做的是创建一个$lapGAP数组,它的大小为 $laps,并且具有基于 $split 和$splitGAP的正确 GAP(带距离权重(。

例如 200m + 400m + 600m = 1200m($lap的前3个条目(。这仍然在$splits的前 1609m 内,因此$lapGAP的前 3 个条目应该是 0.5。

所以

$lapGap = [0.5, 0.5, 0.5...]

但是跑步者然后走800米,跨越$splits的第一个和第二个入口,800米圈中的409米与$splitGap的第一个入口相关,$splitGap的第二个入口为391米。 (409/800)(0.5(+(391/800((-0.1( = 0.20675

$lapGap = [0.5, 0.5, 0.5, 0.20675, ...]

然后跑者圈速1600米,跨越$splits的第二和第三入口,1600米中的1218米将在第二$splits,382米将在第三$splits。做另一个距离加权平均值 (1218/1600)(-0.1(+(382/1600((0.7( = 0.09100

$lapGap = [0.5, 0.5, 0.5, 0.20675, 0.09100...]

等等...

这完成了工作...我想效率不是很高...

$laps = array(200,400,600,800,1600,800,600,400,200,836);
$splits = array(1609,1609,1609,1609.3);
$splitGAP= array(0.5,-0.1,0.7,-0.6);
$splitGAPperMeter = array_fill (0,round($splits[0]),$splitGAP[0]);
for($i = 0; $i < count($splits)-1; $i++){
$splitGAPperMeter = array_merge($splitGAPperMeter, array_fill (round($splits[$i])+1,round($splits[$i+1]),$splitGAP[$i+1]));
}

$sliceOfArray = array_slice($splitGAPperMeter,0,round($laps[0]));
$lapGap[0] = array_sum($sliceOfArray)/count($sliceOfArray);
for($i = 0; $i < count($laps)-1; $i++){
$sliceOfArray = array_slice($splitGAPperMeter,round($laps[$i]),round($laps[$i+1]));
$lapGap[$i+1] = array_sum($sliceOfArray)/count($sliceOfArray);
}

因此,在每个圈值可以(部分(覆盖不超过两个分割,并且分割距离始终相同的条件下,我的做法是这样的。

$laps = [200,400,600,800,1600,800,600,400,200,836];
$splitGAP = [0.5,-0.1,0.7,-0.6];
$splits = array(1609,1609,1609,1609);
$tempSum = $splitIndex = 0;
$result = [];
foreach($laps as $lap) {
// if temporary sum plus current lap is below current threshold, add matching splitGAP value
if($tempSum + $lap <= $splits[$splitIndex]) {
$result[] = $splitGAP[$splitIndex];
$tempSum += $lap;
}
// if temp sum plus current lap crosses threshold, split them up, calculate weighted result,
// and move splitGAP index along by 1.
// second reminder needs to become the new temporary sum
else {
$reminder_1 = $splits[$splitIndex] - $tempSum;
$reminder_2 = $lap - $reminder_1;
$result[] = $splitGAP[$splitIndex] * ($reminder_1 / $lap) +
$splitGAP[$splitIndex+1] * ($reminder_2 / $lap);
$splitIndex++;
$tempSum = $reminder_2;
}
}
var_dump($result);

这给了我以下结果,请验证 0.20675 之后的后期值是否仍然符合您在此处的预期:

array (size=10)
0 => float 0.5
1 => float 0.5
2 => float 0.5
3 => float 0.20675
4 => float 0.091
5 => float 0.7
6 => float 0.32516666666667
7 => float -0.6
8 => float -0.6
9 => float -0.6

最新更新