関数で1パーセントを計算する代わりに、すべての結果を配列として渡し、全体として処理することができます。すべてのパーセンテージを計算して丸めた後、合計が100かどうかを確認します。そうでない場合は、最大値を調整して、すべてを合計100にします。最大値を調整すると、結果の偏りができるだけ少なくなります。
私の例の配列は、調整を行う前に合計100.02になります。
function percent(array $numbers)
{
$result = array();
$total = array_sum($numbers);
foreach($numbers as $key => $number){
$result[$key] = round(($number/$total) * 100, 2);
}
$sum = array_sum($result);//This is 100.02 with my example array.
if(100 !== $sum){
$maxKeys = array_keys($result, max($result));
$result[$maxKeys[0]] = 100 - ($sum - max($result));
}
return $result;
}
$numbers = array(10.2, 22.36, 50.10, 27.9, 95.67, 3.71, 9.733, 4.6, 33.33, 33.33);
$percentages = percent($numbers);
var_dump($percentages);
var_dump(array_sum($percentages));
出力:-
array (size=10)
0 => float 3.51
1 => float 7.69
2 => float 17.22
3 => float 9.59
4 => float 32.86
5 => float 1.28
6 => float 3.35
7 => float 1.58
8 => float 11.46
9 => float 11.46
float 100
これは、関数パラメーターとして連想配列でも機能します。キーは保持されます。
これらの数値は、表、グラフ、またはチャートで表示できるようになり、常に合計100%になります。