2016-05-14 20 views
0

Berechnen mindestens 3 minimalen und maximalen Zahl von Array-Code

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


?> 

Der obige Code berechnet nur eine minimale und eine maximale Anzahl von dem Array. Ich brauche es, um 3 maximale und 3 minimale Zahlen zu berechnen.

Ich kann keine vorgefertigten Funktionen verwenden und kann nicht mehr als eine für die Schleife verwenden, daher bitte ich um die Anpassung innerhalb des obigen Codes.

+1

Was genau meinst du mit "3 Höchstzahlen"? Meinst du nur die 3 größten Zahlen? – Rizier123

+1

Was ist eine "vorgefertigte" Funktion? ist das für ein Schulprojekt? – billynoah

Antwort

1

Das sieht gut aus für mich.

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


?> 

Ausgang:

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

Das ist genial, aber ein kleines Problem Zählfunktion ist vorgefertigt, wie ich bereits erwähnt ich kann nicht zählen vorgefertigte Funktion zählen. Gibt es eine Alternative zum Zählen, die nicht vorgefertigt ist? – TheNoobster

+0

Verwenden Sie foreach ($ k => $ v) {..} $ k ist der Schlüssel $ v ist der Wert – shikhar

-1

Sie müssen nur umgekehrt das Array sortieren und dann die ersten drei Indizes schneiden. Man könnte es als eine Funktion ausdrücken:

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

Siehe rsort und array_slice

Edit: Okay das

/** 
* 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)); 

Wenn $val 's die ersten $key$val' s zu $sort hinzugefügt arbeitet.

Wenn $val 's weniger als $sort[0]$val' s am Anfang von $sort hinzugefügt.

Wenn $val 's mehr als $sort[length], dann $val' s an das Ende von $sort.

Ansonsten überprüfen wir alle $val gegen jeden anderen $sort Wert. Wenn wir einen $sort[$i] Wert größer als $val finden, spleißen wir das Array mit $val bei $i.

Sinn machen?

+0

Kann nicht vordefinierte Funktion wie Rsort Asort und so weiter, – TheNoobster

+0

Fixed es. Sicher können Sie array_slice, drücken etc. – TeamRad

+0

Und wenn Sie nicht sogar array_splice verwenden können, push, die Verschiebung, was ich Ihnen gegeben habe, sollten Sie immer noch tun, wenn Sie einen übereinstimmenden 0, min, max Wert aus dem ursprünglichen Array und Verwenden Sie eine Rekursion für die restlichen Werte (Mitte der Sortierung). – TeamRad

0

Sie können dies unter Verwendung von handhaben, wenn Aussagen

für die max/min Anzahl Überprüfung funktioniert, wenn Sie einen anderen Min/Max-Wert anders als die vorherige, während Looping finden. Dies ist der Algorithmus, der Sie

verwenden Nehmen wir an, dass Ihre min = 5 und nach dem aktuellen Indexwert Looping 3 ist, so dass Sie min=3 machen müssen

Was 5-min2 zum Beispiel die Zuordnung?

Drei Variablen min1, min2, min3 und verschachtelte if-Anweisungen

ich, es ist nicht der beste Weg kennen. Aber hast du das probiert?

+0

Ich glaube, ich habe vergessen zu erwähnen, dass das Array mit Zahlen zufällig sein wird. Daher kann ich das Programm nicht auf bereits definierte Zahlen beschränken, sondern es sollte basierend auf einer beliebigen Zahl auf Array berechnen und 3 Max und 3 Minuten. – TheNoobster

+0

Ich glaube, du hast mich nicht verstanden. Ich wollte keine Konstanten definieren. Diese Zahlen waren nur Beispiele. Ich wollte genauso arbeiten, aber zwei weitere Variablen für die "Min" und zwei hinzufügen mehr Variablen für die 'max', also wenn du den Wert der 'max' Zahl änderst, setze die prev. Wert in 'max2' zum Beispiel –

+0

' $ max1) \t { \t \t $ max3 = $ max2; \t \t $ max2 = $ max1; \t \t $ max1 = $ x; \t} \t else if ($ x> $ max2) \t { \t \t $ max3 = $ max2; \t \t $ max2 = $ x; \t} \t else if ($ x> $ max3) \t \t { \t \t \t \t $ max3 = $ x; \t} \t } echo "Maximale Anzahl = $ max1, $ max2, $ max3
"; ?> 'Dies ist ein Beispiel für max 3 Zahlen für das, was ich meinte –

0

Dieser Code funktioniert ordnungsgemäß

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


?> 

Der Ausgang ist

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

Es gibt bessere Möglichkeiten und effizienter als das, aber das erfordert 2 Schleifen und du Das will ich!