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) で除算することであり、それは完全に機能します。今私がする必要があるのは、支配的になり、そこから減算できない1つの値を選択し、合計が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 に答える