各个数值之和应该如何等于数组中的父值?

时间:2017-08-30 00:45:19

标签: php arrays

我正在尝试设置逻辑并计算一些值,但计算似乎是错误的。

更新:

让我解释一下,例如我有[23,11,39]等数组中的一系列值,然后在下一个数组中,我将这些值除以第一个数组元素的每个值的3个值: 23我把它分成3个值10,10,3所以这3个值的总和等于后面23然后和其他其他值一样然后接下来我计算所有这些值相对于40的值即ie那个23将会是多少23个然后其余的然后以相同的方式对于分割值也是如此问题是分割值的总和应该等于父计算值40但是它们不是当我把它们相互理解。这就是问题!

你能告诉我我做错了什么以及如何解决这个问题?

这是我的代码:

$data = [76,190,120,39,56,11,17,67,45,23,76,54];
$data_divided = [[32,14,30],[100,80,10],[50,40,30],[20,10,9],[6,40,10],[3,5,3],[10,4,3],[50,10,7],[30,10,5],[10,20,3],[30,40,6],[4,25,25]];

    $min = min($data);
    $max = max($data) - $min;
    $n_data = array();
    $i = 0;
    foreach ($data_divided as $value) {
        $n_value = (($data[$i] - $min) / $max)*40;
        $n0 = (($value[0] - $min) / $max)*40;
        $n1 = (($value[1] - $min) / $max)*40;
        $n2 = (($value[2] - $min) / $max)*40;
        $n_data[] = [$n_value => [abs($n0),abs($n1),abs($n2)], abs($n0)+abs($n1)+abs($n2) ];
        echo "Parent Value : ".$n_value."<br>";
        echo "n0 : ".abs($n0)."<br>";
        echo "n1 : ".abs($n1)."<br>";
        echo "n2 : ".abs($n2)."<br>";
        echo "n0+n1+n2 : ".(abs($n0)+abs($n1)+abs($n2))."<br><br><br>";
        $i++;
    }

这是输出为:

Parent Value : 14.525139664804
n0 : 4.6927374301676
n1 : 0.67039106145251
n2 : 4.2458100558659
n0+n1+n2 : 9.608938547486


Parent Value : 40
n0 : 19.888268156425
n1 : 15.418994413408
n2 : 0.22346368715084
n0+n1+n2 : 35.530726256983


Parent Value : 24.357541899441
n0 : 8.7150837988827
n1 : 6.4804469273743
n2 : 4.2458100558659
n0+n1+n2 : 19.441340782123


Parent Value : 6.2569832402235
n0 : 2.0111731843575
n1 : 0.22346368715084
n2 : 0.44692737430168
n0+n1+n2 : 2.6815642458101


Parent Value : 10.055865921788
n0 : 1.1173184357542
n1 : 6.4804469273743
n2 : 0.22346368715084
n0+n1+n2 : 7.8212290502793


Parent Value : 0
n0 : 1.7877094972067
n1 : 1.340782122905
n2 : 1.7877094972067
n0+n1+n2 : 4.9162011173184


Parent Value : 1.340782122905
n0 : 0.22346368715084
n1 : 1.5642458100559
n2 : 1.7877094972067
n0+n1+n2 : 3.5754189944134


Parent Value : 12.513966480447
n0 : 8.7150837988827
n1 : 0.22346368715084
n2 : 0.89385474860335
n0+n1+n2 : 9.8324022346369


Parent Value : 7.5977653631285
n0 : 4.2458100558659
n1 : 0.22346368715084
n2 : 1.340782122905
n0+n1+n2 : 5.8100558659218


Parent Value : 2.6815642458101
n0 : 0.22346368715084
n1 : 2.0111731843575
n2 : 1.7877094972067
n0+n1+n2 : 4.0223463687151


Parent Value : 14.525139664804
n0 : 4.2458100558659
n1 : 6.4804469273743
n2 : 1.1173184357542
n0+n1+n2 : 11.843575418994


Parent Value : 9.608938547486
n0 : 1.5642458100559
n1 : 3.1284916201117
n2 : 3.1284916201117
n0+n1+n2 : 7.8212290502793

预期输出

Parent Value : 14.525139664804
n0 : 4.6927374301676
n1 : 0.67039106145251
n2 : 4.2458100558659
n0+n1+n2 : 14.525139664804


Parent Value : 40
n0 : 19.888268156425
n1 : 15.418994413408
n2 : 0.22346368715084
n0+n1+n2 : 40


Parent Value : 24.357541899441
n0 : 8.7150837988827
n1 : 6.4804469273743
n2 : 4.2458100558659
n0+n1+n2 : 24.357541899441


Parent Value : 6.2569832402235
n0 : 2.0111731843575
n1 : 0.22346368715084
n2 : 0.44692737430168
n0+n1+n2 : 6.2569832402235


Parent Value : 10.055865921788
n0 : 1.1173184357542
n1 : 6.4804469273743
n2 : 0.22346368715084
n0+n1+n2 : 10.055865921788


Parent Value : 0
n0 : 1.7877094972067
n1 : 1.340782122905
n2 : 1.7877094972067
n0+n1+n2 : 0


Parent Value : 1.340782122905
n0 : 0.22346368715084
n1 : 1.5642458100559
n2 : 1.7877094972067
n0+n1+n2 : 1.340782122905


Parent Value : 12.513966480447
n0 : 8.7150837988827
n1 : 0.22346368715084
n2 : 0.89385474860335
n0+n1+n2 : 12.513966480447


Parent Value : 7.5977653631285
n0 : 4.2458100558659
n1 : 0.22346368715084
n2 : 1.340782122905
n0+n1+n2 : 7.5977653631285


Parent Value : 2.6815642458101
n0 : 0.22346368715084
n1 : 2.0111731843575
n2 : 1.7877094972067
n0+n1+n2 : 2.6815642458101


Parent Value : 14.525139664804
n0 : 4.2458100558659
n1 : 6.4804469273743
n2 : 1.1173184357542
n0+n1+n2 : 14.525139664804


Parent Value : 9.608938547486
n0 : 1.5642458100559
n1 : 3.1284916201117
n2 : 3.1284916201117
n0+n1+n2 : 9.608938547486

1 个答案:

答案 0 :(得分:1)

这是我的建议......

将两个数组中的所有数据减少一个因子,该因子只会产生040之间的值。为了提高在预期总值($data)和分割值之和($data_divided)之间建立清晰关系的可能性,我建议将因子UP舍入到下一个整数({{1 }})。在此过程中,您不再需要通过减法或ceil()来损坏$divided_data

我的演示将存储和显示初始值,计算值以及它们之间的数学差异。正如您将在我的评论和输出中看到的那样,只有索引为abs()的子数组不会完全匹配 - 我相信这只是一个错字。

所有计算出的数据都在可接受的范围内,最大值为9,最小值为38此方法不保证0.6的最大值,但它会为您提供数据我很有可能完全加起来。如果您从40公式中删除ceil()函数,您会注意到$factor成为可能,但也会出现一些值&#34; fray&#34; (有些比其他人差)。

代码:(Demo

40

输出:

$data = [76,190,120,39,56,11,17,67,45,23,76,54];
// notice flawed data-----------------^^

$data_divided = [[32,14,30],[100,80,10],[50,40,30],[20,10,9],[6,40,10],[3,5,3],[10,4,3],[50,10,7],[30,10,5],[10,20,3],[30,40,6],[4,25,25]];
// notice flawed data----------------------------------------------------------------------------------------^^^^^^^

$factor=ceil(max($data)/40); // 5 in this case (rounds up to a clean integer for future dividing)

$n_data = array();
foreach ($data_divided as $i=>$a) {
    $n_value=$data[$i]/$factor;  // reduce expected sum value
    $a=array_map(function($v)use($factor){return $v/$factor;},$a);  // reduce split values
    $sum=array_sum($a);  // sum the reduced split values
    $n_data[]=[
               "N_Value"=>$n_value,
               "Split"=>$a,
               "Sum"=>$sum,
               "Diff"=>$n_value-$sum  // find difference in calculated values
               ];
}
$data = $n_data;
var_export($data);