2017-08-30 84 views
0

我想设置一个逻辑并计算一些值,但计算似乎是错误的。单个数值的总和应该如何等于数组中的父值?

UPDATE:

让我解释,例如我有[23,11,39]等,在阵列中的一系列值,然后在接下来的阵列我这些值除以成每个3个值第一个数组元素的值为:对于23我将它分成3个值为10,10,3,因此这3个值的总和等于后退23,然后与其他值相同,然后接下来我计算所有这些的值相对于40即,即将在40中剩余多少,然后剩余部分以及对于除法值也是相同的方式,所以问题在于分割值的总和应该等于父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 
+0

你想要什么预期的结果?以阵列格式向我们展示 –

+0

@AlivetoDie:我希望'$ n0 + $ n1 + $ n2'的值等于'$ n_value' –

+0

@AlivetoDie如果可能的话,我也不想让最小的值为0但'$ n_value'大于0 –

回答

1

这是我的建议...

将两个阵列中的所有数据减少一个因子,该因子将只产生040之间的值。为了提高预期总值($data)与分割值总和($data_divided)之间的干净关系的可能性,我建议将因子UP四舍五入到下一个整数(ceil())。在这样做时,您不再需要用减法或abs()损坏$divided_data

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

全部计算出的数据是与38一个最大和0.6一分钟这种方法在可接受的范围内,不保证40一个最大值,但它会给你的数据我很好正是加起来的机会。如果从$factor公式中删除ceil()函数,则会注意到40变得可能,但也会出现一些值“fray”(某些值比其他值更差)。

代码:(Demo

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

输出:

array (
    0 => 
    array (
    'N_Value' => 15.2, 
    'Split' => 
    array (
     0 => 6.4, 
     1 => 2.8, 
     2 => 6.0, 
    ), 
    'Sum' => 15.2, 
    'Diff' => 0.0, 
), 
    1 => 
    array (
    'N_Value' => 38.0, 
    'Split' => 
    array (
     0 => 20.0, 
     1 => 16.0, 
     2 => 2.0, 
    ), 
    'Sum' => 38.0, 
    'Diff' => 0.0, 
), 
    2 => 
    array (
    'N_Value' => 24.0, 
    'Split' => 
    array (
     0 => 10.0, 
     1 => 8.0, 
     2 => 6.0, 
    ), 
    'Sum' => 24.0, 
    'Diff' => 0.0, 
), 
    3 => 
    array (
    'N_Value' => 7.8, 
    'Split' => 
    array (
     0 => 4.0, 
     1 => 2.0, 
     2 => 1.8, 
    ), 
    'Sum' => 7.8, 
    'Diff' => 0.0, 
), 
    4 => 
    array (
    'N_Value' => 11.2, 
    'Split' => 
    array (
     0 => 1.2, 
     1 => 8.0, 
     2 => 2.0, 
    ), 
    'Sum' => 11.2, 
    'Diff' => 0.0, 
), 
    5 => 
    array (
    'N_Value' => 2.2, 
    'Split' => 
    array (
     0 => 0.6, 
     1 => 1.0, 
     2 => 0.6, 
    ), 
    'Sum' => 2.2, 
    'Diff' => 0.0, 
), 
    6 => 
    array (
    'N_Value' => 3.4, 
    'Split' => 
    array (
     0 => 2.0, 
     1 => 0.8, 
     2 => 0.6, 
    ), 
    'Sum' => 3.4, 
    'Diff' => 0.0, 
), 
    7 => 
    array (
    'N_Value' => 13.4, 
    'Split' => 
    array (
     0 => 10.0, 
     1 => 2.0, 
     2 => 1.4, 
    ), 
    'Sum' => 13.4, 
    'Diff' => 0.0, 
), 
    8 => 
    array (
    'N_Value' => 9.0, 
    'Split' => 
    array (
     0 => 6.0, 
     1 => 2.0, 
     2 => 1.0, 
    ), 
    'Sum' => 9.0, 
    'Diff' => 0.0, 
), 
    9 => 
    array (
    'N_Value' => 4.6, 
    'Split' => 
    array (
     0 => 2.0, 
     1 => 4.0, 
     2 => 0.6, 
    ), 
    'Sum' => 6.6, 
    'Diff' => -2.0, 
), 
    10 => 
    array (
    'N_Value' => 15.2, 
    'Split' => 
    array (
     0 => 6.0, 
     1 => 8.0, 
     2 => 1.2, 
    ), 
    'Sum' => 15.2, 
    'Diff' => 0.0, 
), 
    11 => 
    array (
    'N_Value' => 10.8, 
    'Split' => 
    array (
     0 => 0.8, 
     1 => 5.0, 
     2 => 5.0, 
    ), 
    'Sum' => 10.8, 
    'Diff' => 0.0, 
), 
) 
相关问题