PHP规范化范围内的百分比值

时间:2012-11-13 15:38:24

标签: php math numbers normalization

我有一个数组数组,无法确定数组中的大量属性。

example:

array(30, 30, 10, 20, 60);
array(2, 53, 71, 22);
array(88, 22, 8);
etc...

现在通常,所有数组值的总和将为100或更小。

我想要做的是,当它们超过100时,将它们全部缩小以使其等于100.通常我只是将差异除去然后带走但是例如,第一个数组加起来为150,并且如果我平均分配差异(50),我最终会得到:

array(20, 20, 0, 10, 50);

但是我希望根据数字大小减去数字,所以30将会有更大的数据块,然后是10。

我这样做的方法是将每个值除以(total_sum / 100),这样就完美了。现在我需要做的是能够选择一个成为主导但不能从中减去所有其他值的值,直到sum为100.示例如下:

array(20, 20, 80); // 80 is the dominant number

After normalising, the array would be:

array(10, 10, 80);

Example 2:

array(20, 20, 40, 60); // 40 is dominant number

after normalising:

array(10, 10, 40, 20) // maybe it wouldnt be those exact values bhut just to show how different size numbers get reduced according to size. But now total sum is 100

Example 3:
array(23, 43, 100, 32) // 100 is dominant
normalise
array(0, 0, 100, 0);

我尝试过很多东西,但似乎没什么用。我将如何做到这一点?

由于

2 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,你就完成了。只需从输入数组中删除显性值,将100减去该值,然后像以前一样完成其余操作:

function helper($values, $sum) {
  $f = array_sum($values) / $sum;
  return array_map(function ($v) use($f) {
    return $v / $f;
  }, $values);
}

// input
$a = array(20, 20, 40, 60);

// remove the dominant value (index: 2)
$b = array_splice($a, 2, 1);

// `normalize` the remaining values using `100 - dominant value` instead of `100`
$c = helper($a, 100 - $b[0]);

// re-inject the dominant value
array_splice($c, 2, 0, $b);

// output
print_r($c); // => [12, 12, 40, 36]

答案 1 :(得分:0)

试试这个?

function normalise_array($array_to_work_on,$upper_limit){

    $current_total = array_sum($array_to_work_on);
    $reduce_total_by = $current_total - $upper_limit;
    $percentage_to_reduce_by = floor(($reduce_total_by / $current_total) * 100);

    $i = 0;
    $new_array;
    foreach($array_to_work_on as $item){
        $reduce = ($item / 100) * $percentage_to_reduce_by;
        $new_array[$i] = floor($item - $reduce);
        $i ++;
        echo $new_array[$i];
    }
    return($new_array);
}

$numbers1 = array(30, 30, 10, 20, 89);
print_r(normalise_array($numbers1,20));
echo "<br />";
echo "<br />First array total: ".array_sum(normalise_array($numbers1,20));

echo "<br /><br/ >";

$numbers2 = array(234, 30, 10, 20, 60);
print_r(normalise_array($numbers2,100));

echo "<br />First array total: ".array_sum(normalise_array($numbers2,100));