假设我有一个数组
$x = (31,12,13,25,18,10);
我想以这样一种方式减少这个数组,使每个数组元素的值都是32
. 所以下班后我的数组会变成
$newx = (32,32,32,13);
我必须以这样一种方式生成这个数组,数组值的总和永远不会大于32
. 所以要创建第一个值,我1
将从第二个索引值减少,即12
第二个值将变为11
,第一个索引值将变为31+1 = 32
。这个过程应该继续,以便每个数组值都等于32
。
使用一些基本的数学是最简单的:
$input = array(31,12,13,25,18,10);
$val = 32; // set the value: 32
$sum = array_sum($input); // calculate sum: 109
$output = array_fill(0, $sum/$val, $val); // fill in int(109/32) = 3 reps of 32
$rest = $sum % $val; // however, 109*32 = 96,
if ($rest) { // so if there is a rest (here 13)
$output[] = $rest; // we add the remaining 13
}
决赛$output
:
array (
0 => 32,
1 => 32,
2 => 32,
3 => 13,
)
解释采取的每个步骤的稍微详细的方法 -
$x = array(31,12,13,25,18,10);
$total = 0;
// get the total values of the array
foreach($x as $val){
$total += $val;
}
// calculate whole divisions
$divisions = floor($total / 32);
// calculate remainder
$remainder = $total % 32;
$finalArr = array();
// populate array with whole whole divisions
for ($i=0;$i<$divisions;$i++){
$finalArr[] = 32;
}
// last element is the remainder
if($remainder > 0 ){
$finalArr[] = $remainder;
}
输出 -
Array
(
[0] => 32
[1] => 32
[2] => 32
[3] => 13
)