Вычислить не менее 3 минимальных и максимальных чисел из массива

Код

<?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 минимальных числа.

Я не могу использовать готовые функции и не могу использовать более одной для цикла, поэтому, пожалуйста, предложите мне выполнить настройку в приведенном выше коде.

0

Решение

Это выглядит аккуратно для меня.

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

Другие решения

Этот код работает правильно

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

Есть лучшие способы и более эффективные, чем те, которые требуют двух циклов, а вы этого не хотите!

0

Вы можете справиться с этим, используя операторы if

Проверка максимального / минимального числа работает, когда во время цикла вы найдете другое минимальное / максимальное значение, отличное от предыдущего. Это алгоритм, который вы используете

Предположим, что ваш минимум = 5
и после зацикливания текущее значение индекса равно 3, так что вам придется сделать min=3

Как насчет назначения 5 для min2 например?

Три переменные min1, min2, min3 и вложенные операторы if

Я знаю, что это не лучший способ. Но ты пробовал это?

0

Вам просто нужно выполнить обратную сортировку массива и затем нарезать первые три индекса. Вы можете выразить это как функцию:

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

Увидеть rsort а также array_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,

Есть смысл?

-1
По вопросам рекламы [email protected]