代码
<?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);
}
参见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
时,我们在$i
处将阵列与$val
拼接。
有道理吗?