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


Calculate at least 3 minimum and maximum numbers from array

代码

<?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循环,所以建议我在上面的代码中进行自定义。

这对我来说很整洁。

<?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

此代码工作正常

<?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个循环,你不想这样!

您可以使用if语句处理此问题

当您在循环时发现除上一个值之外的另一个最小/最大值时,检查最大/最小值有效。这是你使用的算法

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

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

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

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

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

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时,我们在$i处将阵列与$val拼接。

有道理吗?