-3

假设我有一个数组

$x = (31,12,13,25,18,10);

我想以这样一种方式减少这个数组,使每个数组元素的值都是32. 所以下班后我的数组会变成

$newx = (32,32,32,13);

我必须以这样一种方式生成这个数组,数组值的总和永远不会大于32. 所以要创建第一个值,我1将从第二个索引值减少,即12第二个值将变为11,第一个索引值将变为31+1 = 32。这个过程应该继续,以便每个数组值都等于32

4

2 回答 2

2

使用一些基本的数学是最简单的:

$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,
)
于 2012-06-09T10:32:04.100 回答
0

解释采取的每个步骤的稍微详细的方法 -

$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
)    
于 2012-06-09T10:36:45.260 回答