2017-08-30 87 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, 
), 
) 
相關問題