1

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

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),并且效果很好。现在我需要做的是能够选择一个占主导地位且不能从中减去的值,然后减去所有其他值,直到总和为 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);

我尝试了很多东西,但似乎没有任何效果。我将如何做到这一点?

谢谢

4

2 回答 2

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]
于 2012-11-13T16:17:12.240 回答
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));
于 2012-11-13T16:04:42.767 回答