2017-05-14 2 views
0

Ich habe ein Array in PHP mit sich wiederholenden Zahlen und ich würde gerne die häufigsten finden, aber nur wenn es nur eine davon gibt.Finden Sie die häufigste Nummer in PHP-Array

while (count(array_count_values($arr)) > 1) { 
$minim = min(array_count_values($arr)); 
while ($minim == min(array_count_values($arr))) { 
    unset($arr[array_search(array_search(min(array_count_values($arr)), array_count_values($idList)), $arr)]); 
    $arr = array_splice($arr, 0, 1); 
} 
} 

In meinem Code die erste während läuft, bis ich nur eine Nummer (mehrfach) in der Anordnung haben und mit dem zweiten ich die weniger häufig Zahlen löschen. Mein Problem ist das ich bekomme diesen Fehler für meine Sekunde min(): "Array muss mindestens ein Element enthalten".

Antwort

0

Ich habe ein Array in PHP mit sich wiederholenden Zahlen und ich würde gerne die häufigsten finden, aber nur wenn es nur eine davon gibt.

Ihr Ansatz scheint ziemlich kompliziert.

Hier ist, wie ich das tun würde:

$numbers = [1, 6, 5, 6, 2, 1, 6, 7, 8]; // positive test case 
//$numbers = [1, 6, 5, 6, 2, 1, 6, 7, 8, 1]; // negative test case 

$count = array_count_values($numbers); // get count of occurrence for each number 

arsort($count); // sort by occurrence, descending 

$first = key($count); // get key of first element, because that is the/one 
         // of the highest number(s) 
$count_first = current($count); // get occurrence for first array value 
$count_second = next($count); // get occurrence for second array value 

if($count_first != $count_second) { // did they occur in different frequencies? 
    echo $first . ' occurred most in input array.'; 
} 
else { 
    echo 'input array contained multiple values with highest occurrence.'; 
} 
+0

lol ich hatte keine ahnung PHP hatte eine 'array_count_values' Funktion ... Oh PHP, die Überraschungen kommen einfach weiter. Ich habe das 'array_reduce' in meiner Antwort zugunsten dieser eingebauten Funktion entfernt. – naomik

0

Sie könnten wahrscheinlich eine array_reduce den Punkten führen die max zu finden, sondern weil array_reduce Sie die Schlüssel, die iterable Zugriff nicht geben Sie zusätzliche Transformation durchführen müssten.

Stattdessen würde ich empfehlen Ihnen, Ihre eigenen MaxHeap aufzubauen, indem sich von SplMaxHeap

class MaxHeap extends SplMaxHeap { 
    public function compare($a, $b) { 
    if (current($a) < current($b)) 
     return -1; 
    elseif (current($a) > current($b)) 
     return 1; 
    else 
     return 0; 
    } 
} 

Dann können wir sie als solche verwendet werden - die Antwort sagt [ 7 => 4 ] das bedeutet: ist die häufigste Zahl, erscheinen mal

$heap = new MaxHeap(); 
foreach (array_count_values($numbers) as $n => $count) 
    $heap->insert([$n => $count]); 

print_r($heap->top()); 
// [ 7 => 4 ] 

printf("%d is the most common number, appearing %d times", 
    key($heap->top()), 
    current($heap->top()) 
); 
// 7 is the most common number, appearing 4 times 

komplettes Skript

$numbers = [0, 1, 1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 7, 7, 8, 8, 9]; 

class MaxHeap extends SplMaxHeap { 
    public function compare($a, $b) { 
    if (current($a) < current($b)) 
     return -1; 
    elseif (current($a) > current($b)) 
     return 1; 
    else 
     return 0; 
    } 
} 

$heap = new MaxHeap(); 
foreach (array_count_values($numbers) as $n => $count) 
    $heap->insert([$n => $count]); 

printf("%d is the most common number, appearing %d times", 
    key($heap->top()), 
    current($heap->top()) 
); 

Revisionsgeschichte

ich keine Kenntnis von PHP native array_count_values Funktion war. Ich entfernte die komplexere array_reduce zugunsten dieser super spezialisierten Funktion. Danke, @CBroe.

+0

Damit ich weiß nicht, ob es mehrere häufigste Element ist. Zum Beispiel, wenn ich eine weitere 1 zum Array hinzufüge, bekomme ich, dass 1 am häufigsten ist. Ich möchte wissen, ob es nur eine am häufigsten gibt und nur dann die genaue Anzahl. – utinum

+0

@utinum und was genau ist das "Problem" damit? Wenn das der Fall ist, dann wird ja das * erste * häufigste Element im Heap zurückgegeben. Was wäre eine unproblematische Antwort? Sollte es beides zurückgeben? Wenn es eine Krawatte gibt, sollte sie die größere Zahl zurückgeben? Wenn es ein Unentschieden gibt, sollte es "null" zurückgeben, wenn es keine * allgemeinste * Nummer gibt? Mein Punkt ist, es ist kein * Problem *, das Verhalten ist einfach * undefiniert *. Definieren Sie, was Sie gerne tun würden, und wir können es schaffen. – naomik

Verwandte Themen