Код
<?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 минимальных числа.
Я не могу использовать готовые функции и не могу использовать более одной для цикла, поэтому, пожалуйста, предложите мне выполнить настройку в приведенном выше коде.
Это выглядит аккуратно для меня.
<?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
Есть лучшие способы и более эффективные, чем те, которые требуют двух циклов, а вы этого не хотите!
Вы можете справиться с этим, используя операторы if
Проверка максимального / минимального числа работает, когда во время цикла вы найдете другое минимальное / максимальное значение, отличное от предыдущего. Это алгоритм, который вы используете
Предположим, что ваш минимум = 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);
}
Увидеть 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
,
Есть смысл?