从数组中计算至少3个最小和最大数字

时间:2016-05-14 15:29:27

标签: php arrays max min

代码

<?php

    $array = array("1", "2", "3", "4", "5", "6", "7", "8", "100");
    $max = $temp = 0;
    $min = $temp = 0;

    //This loop is to get max and min value from array
    for ($i = 0 ; $i < count($array); $i++) {

        if ($i == 0) {
            $max = $temp = $array[$i];
        }

        if ($i > 0) {
            if ($array[$i] > $temp) {
                $max = $array[$i];
            }
        }

        if ($i == 0) {
            $min = $temp = $array[$i];
        }

        if ($i < 0) {
            if ($array[$i] < $temp) {
                $min = $array[$i];
            }
        }

    }

    echo "Max Number = $max <br>";
    echo "Min Number = $min";


?>

以上代码仅计算数组中的一个最小值和一个最大值。我需要它来计算3个最大值和3个最小值。

我不能使用预制函数,也不能使用多个for循环,所以请在上面的代码中建议我自定义。

4 个答案:

答案 0 :(得分:1)

这看起来很整洁。

<?php

$array = array("1", "2", "3", "4", "5", "6", "7", "8", "100");

$n1 = $n2 = $n3 = 1000 ;  // some high number
$m1 = $m2 = $m3 = 0 ;

//This loop is to get max and min value from array
for ($i = 0 ; $i < count($array); $i++) {
    $x = $array[$i] ; 
    //min        
    if ($x <= $n1){
        $n3 = $n2 ;
        $n2 = $n1 ;            
        $n1 = $x ;
    } elseif ($x < $n2){
        $n3 = $n2;
        $n2 = $x;
    } elseif ($x < $n3){
        $n3 = $x;
    }

    //max
    if ($x >= $m1){
        $m3 = $m2 ;
        $m2 = $m1 ;            
        $m1 = $x ;
    } elseif ($x > $m2){
        $m3 = $m2;
        $m2 = $x;
    } elseif ($x > $m3){
        $m3 = $x;
    }        

}

echo "Min Number = $n1 $n2 $n3<br>";
echo "Max Number = $m1 $m2 $m3";


?>

输出:

Min Number = 1 2 3
Max Number = 100 8 7

答案 1 :(得分:0)

您可以使用if语句

来处理此问题

在循环时找到除前一个之外的其他最小/最大值时,检查最大/最小值是否有效。这是您使用的算法

让我们假设您的min = 5 循环后当前索引值为3,因此您必须进行min=3

例如,将{5}分配给min2怎么样?

三个变量min1,min2,min3和嵌套的if语句

我知道这不是最好的方式。但你试过这个吗?

答案 2 :(得分:0)

此代码正常运行

<?php

    $array = array("1", "2", "3", "4", "5", "6", "7", "8", "100");

    $max1 =$max2 =$max3= -999999999999999; // highest possible number
    $min3 = $min2= $min1 = 9999999999999999; // lowest possible number

    for ($i = 0 ; $i < count($array); $i++) {
        $x = $array[$i] ;

        //to get the max 3 numbers
       if($x>= $max1)
       {
           $max3 = $max2;
           $max2 = $max1;
           $max1 = $x;
       }
       else if ($x> $max2)
       {
           $max3 = $max2;
           $max2 = $x;
       }
        else if ($x> $max3)
        {

           $max3 = $x;
       }
       // to get the min 3 numbers
        if($x<=$min3 && $x>$min2 )
       {
           $min3 = $x;

       }
       else if ($x<$min2 && $x>$min1)
       {
           $min3 = $min2;
           $min2 = $x;
       }
        else if ( $x<$min1)
        {
           $min3 = $min2;
           $min2 = $min1;
           $min1 = $x;
        }


    }

    echo "Max Number = $max1 , $max2 , $max3 <br>";
    echo "Min Number = $min1 , $min2 , $min3";


?>

输出

Max Number = 100 , 8 , 7 
Min Number = 1 , 2 , 3

有比这更好的方法和更高效的方法,但需要2个循环而且你不想要它!

答案 3 :(得分:-1)

您只需要对数组进行反向排序,然后对前三个索引进行切片。你可以把它表达为一个函数:

function topThree(Array $arr) {
    // Sort the array in reverse
    rsort($arr); 
    // Return the first three indexes (top three)
    return array_slice($arr, 2);
}

请参阅rsortarray_slice

编辑:好的,这是有效的

/**
 * Sorts an array of numeric values from largest to 
 * smallest and returns the three highest values.
 *
 * @param  Array  $arr  An array of numeric values.
 * @return Array  $srt  The three highest values in $arr.
 */
   function topThree(Array $arr) {
    $srt = [];
    foreach($arr as $key => $val) {
        if(!$key) { 
            $srt[] = $val;
        } else if ($val < $srt[0]) { 
            array_unshift($srt, $val); 
        } else if ($val > $srt[count($srt)-1]) { 
            array_push($srt, $val);
        } else {
            for( $i=1; $i<count($srt); $i++) {
                if($val < $srt[$i]) {
                    array_splice( $srt, $i, 0, $val );
                    break;
                }
            }
        }
    }
    $max = array_slice($srt, -3, 3);
    $min = array_slice($srt, 0, 3);

    return ["min" => $min, "max" => $max];
   }


// "Test"
for($i=0; $i<20;$i++){
    $arr[]=rand(-100,100);
}

print_r($arr);
print_r(topThree($arr));

如果$val将第$key $val$sort添加到$val

如果$sort[0]小于$val $sort被添加到$val的开头。

如果$sort[length]大于$val,则$sort已添加到$val的末尾。

否则,我们会针对每个其他$sort值检查每个$sort[$i]。当我们发现$val值大于$val时,我们会在$i处将数组与public string payload { get; set; } 拼接在一起。

有意义吗?