如何使PHP数组值更快地相互等待

时间:2012-01-30 05:47:25

标签: php arrays loops

假设我有一系列这些值:

$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);
?>

1 个答案:

答案 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变量用于以后需要的任何内容。