假设我有一系列这些值:
$arr = array(190, 2215, 2, 61);
在我用694循环运行代码后,我得到了这个最终值:
Array
(
[0] => 696
[1] => 696
[2] => 696
[3] => 696
)
如何让这个过程更快更好?我只能将值增加或减少1
以下是我的代码。
<?php
echo '<pre>';
$arr = array(190, 2215, 2, 61);
sort($arr);
print_r($arr);
$arrLength = count($arr);
$counter = 0;
loop:
$counter++;
for($i=0; $i<$arrLength; $i++){
if($arr[$i] < $arr[$arrLength-1] && $arr[$arrLength-1] != $arr[$arrLength-2]) {
$arr[$i]++;
$arr[$arrLength-1]--;
}else if($arr[$i] < $arr[$arrLength-1] && $arr[$arrLength-1] == $arr[$arrLength-2]) {
$arr[$i]++;
}
}
if($arr[0] != $arr[$arrLength-1]) goto loop;
print_r($arr);
print_r($counter);
?>
答案 0 :(得分:3)
您的代码只是找到数组中两个最大值之间的加权平均值,然后将所有内容设置为它(第二大元素的权重为number of elements - 1
,最大元素的权重为1)。你可以这样更容易,更快地完成这项工作:
<?php
echo '<pre>';
$arr = array(190, 2215, 2, 61);
sort($arr);
print_r($arr);
$arrLength = count($arr);
// Find weighted average of second largest element and largest element in array:
$avg = floor(($arr[$arrLength - 2] * ($arrLength - 1) + $arr[$arrLength - 1])/$arrLength);
// Only need this line if you need the end value of counter from your code
// $counter = $avg - $arr[0]; // (964 in this example)
$arr = array_fill(0, $arrLength, $avg);
print_r($arr);
?>
注意:如果您只需要数字(696),那么您不需要array_fill
行。只需将$avg
变量用于以后需要的任何内容。