2016-07-18 6 views
3

Ich möchte ein assoziatives Array sortieren, und es gibt eine integrierte Funktion, um die gleiche viz zu erreichen. arsort(), aber das Problem mit dieser Funktion besteht darin, dass die ursprüngliche Schlüsselreihenfolge nicht beibehalten wird, wenn die Werte gleich sind. z.B.Sortieren eines assoziativen Arrays nach Wert in absteigender Reihenfolge und Beibehaltung der Reihenfolge, wenn Werte gleich sind

$l = [ 
    'a' => 1, 
    'b' => 2, 
    'c' => 2, 
    'd' => 4, 
    'e' => 5, 
    'f' => 5 
]; 

Das Ergebnis, das ich will, ist:

$l = [ 
    'e' => 5, 
    'f' => 5, 
    'd' => 4, 
    'b' => 2, 
    'c' => 2, 
    'a' => 1 
]; 

arsort() gibt das Ergebnis in absteigender Reihenfolge, aber es ordnet zufällig das Element, wenn die Werte gleich sind. Diese Frage ist kein Duplikat von PHP array multiple sort - by value then by key?. In dieser Frage wird nach dem gleichen numerischen Wert gefragt, der alphabetisch sortiert wird, aber in meiner Frage werde ich nach Werten gefragt, die nach der ursprünglichen Reihenfolge sortiert werden sollen, wenn sie gleich sind.

+0

http://php.net/manual/ de/function.array-multisort.php oder http://php.net/manual/en/function.usort.php –

+0

Ich kann das nicht reproduzieren. für Ihr Beispiel, bekomme ich die Ergebnisse, die Sie wollen (e, f, d, b, c, a) mit arsort –

+0

Definitiv reproduzierbar https://3v4l.org/kqZLd – rjdown

Antwort

2

Es gibt wahrscheinlich einen effizienteren Weg, dies zu tun, aber ich denke, das sollte funktionieren, um die ursprüngliche Schlüsselreihenfolge in Gruppen mit dem gleichen Wert zu erhalten. Ich werde mit dieser Anordnung zum Beispiel beginnen:

$l = [ 'a' => 1, 'b' => 2, 'c' => 2, 'd' => 4, 'g' => 5, 'e' => 5, 'f' => 5 ]; 
  1. Gruppe der Array nach Wert:

    foreach ($l as $k => $v) { 
        $groups[$v][] = $k; 
    } 
    

    Da die foreach Schleife das Array sequentiell liest, werden die Schlüssel in ihren entsprechenden eingefügt Gruppen in der richtigen Reihenfolge, und dies wird dazu führen:

    [1 => ['a'], 2 => ['b', 'c'], 4 => ['d'], 5 => ['g', 'e', 'f'] ]; 
    
  2. sortieren die Gruppen in Reihenfolge von absteigenden Schlüssel:

    krsort($groups); 
    
  3. zusammenbauen sortierten Array von der gruppierten Anordnung mit einer verschachtelten Schleife:

    foreach ($groups as $value => $group) { 
        foreach ($group as $key) { 
         $sorted[$key] = $value; 
        } 
    } 
    
+0

@ dont-panic Vielen Dank für die Antwort mit detaillierter Erklärung, es funktioniert gut .. – user3542450

1

Sie können array_multisort verwenden. Die Funktion kann ein wenig verwirrend und wirklich schwer zu erklären sein, aber sie ordnet mehrere Arrays an und das erste Array wird sortiert nach der Reihenfolge der nachfolgenden Arrays sortiert.

Versuchen:

array_multisort($l, SORT_DESC, array_keys($l)); 

das Beispiel Siehe hier: https://3v4l.org/oV8Od

Es sortiert die Array nach Werten absteigend, dann durch die Art auf den Tasten des Arrays aktualisiert wird.

+0

Es funktioniert nicht wie für das Array $ l erwartet = [ 'a' => 1, 'b' => 2, 'c' => 2, 'd' => 4, ‚g '=> 5, ' e '=> 5, ' f '=> 5 ]; Ich möchte die Antwort zu sein g, e, f, d, b, c, a aber es gibt mir e, f, g, d, b, c, a. – user3542450

+0

In diesem Fall haben Sie benutzerdefinierte Logik ('g' ist in der Regel nach 'e' und 'g'), so müssen Sie einige benutzerdefinierte Sortieralgorithmen implementieren – Scopey

+0

Könnten Sie mir bitte helfen, diese Logik zu schreiben. Meine Problemstellung ist einfach, wenn der Wert gleich ist, folgen sie der gleichen Reihenfolge wie das ursprüngliche Array. – user3542450

Verwandte Themen