2017-09-17 3 views
1

Dies ist das Beispiel # 1 von der php.net usort() Seite:Wie sieht man die Schritte von usort() in PHP?

<?php 
function cmp($a, $b) { 
    if ($a == $b) { 
     return 0; 
    } 
    return ($a < $b) ? -1 : 1; 
} 

$a = array(3, 2, 5, 6, 1); 

usort($a, "cmp"); 

foreach ($a as $key => $value) { 
    echo "$key: $value\n"; 
} 
?> 

usort Die Funktion, die Werte innerhalb der Anordnung als Paare ($ a- $ b nimmt, so ist dies - 3-2 , 2-5, 5-6, 6-1) und verschiebt den $ b-Wert in Abhängigkeit davon, ob die cmp() - Funktion -1, 0 oder 1 zurückgibt. Wenn es -1 ist, wird $ b nach unten verschoben (innerhalb eines aktuellen Wertes) Paar), wenn es 0 ist, bleibt es an der gleichen Stelle und wenn es 1 ist, wird es nach oben bewegt. So soll das funktionieren, basierend auf dem Top-Kommentar von der php.net Manual usort() Seite.

Gibt es eine Möglichkeit zu sehen, wie dies Schritt für Schritt funktioniert (der Sortierprozess)? Kann ich es sehen oder ist es nur möglich, das Endergebnis nach dem Sortieren zu sehen? Ich möchte vollständig verstehen, wie dieser Prozess funktioniert.

+0

Kann ich schreiben, ein Stück von PHP-Code sehen, die mir ermöglichen würde, die Schritte dieser besonderen usort() Sortierung zu sehen? –

+0

PHP implementiert einen Sortieralgorithmus und verwendet, wenn es zwei Elemente vergleichen muss, den Rückruf, den Sie als zweites Argument für 'usort()' bereitstellen. Es gibt Dutzende Sortieralgorithmen. PHP verwendet wahrscheinlich Quicksort (es ist einer der schnellsten Sortieralgorithmen); Sie können dies herausfinden, indem Sie die PHP-Quellen überprüfen. Sie können die Vergleichsfunktion auch Informationen über ihre Argumente anzeigen lassen. Wenn Sie Algorithmen gut sortieren können, können Sie sie basierend auf diesen Informationen identifizieren. Wenn Sie nicht, na ja, ich schätze, es hilft Ihnen nicht zu viel (und Sie müssen einige Sortieralgorithmen lernen). – axiac

+0

Ja, ich denke, dass dies der Usort ist, der auf dem Top-Kommentar dieser Handbuchseite basiert. Ich frage mich, ob ich die Schritte dazu sehen kann. Oder wahrscheinlich nicht? Es gibt nur das Ergebnis, wenn es fertig ist/am Ende? Ich denke, wenn das Quicksort ist, müsste ich schauen, wie das funktioniert. EDIT: Also wahrscheinlich keine Möglichkeit, es von der PHP-Ebene zu sehen und nur in den Quicksort zu schauen? –

Antwort

0

Mit einigen Debug-Ausgaben in Ihrer Vergleichsfunktion können Sie nur die Vergleiche sehen, die PHP durchführt, aber keine Zwischenzustände des Arrays sehen.

Aber der Algorithmus in Usort ist bekannt - es ist QuickSort (Which sort algorithms does PHP's usort apply?).

Sie können ihre Visualisierung bei http://www.algomation.com/algorithm/quick-sort-visualization (oder einfach nur google „quicksort Algorithmus Visualisierung“)

+0

Ich habe herausgefunden, dass ich in echo-Anweisungen mischen kann und auch var_dump verwenden - das würde mir zeigen, wie sich der Code verhält. Es sieht so aus, als würde sich das Array in der Mitte des Prozesses nicht ändern und es ändert sich nur am Ende. –

+0

https://pastebin.com/5z0m1Yvp - Mit diesem Stück Code sieht es aus wie der Usort erstellt 12 separate $ a und $ b Paare und bis zu diesem Zeitpunkt dachte ich, dass es sechs - 2-1, 1-3 wäre , 3-4, 4-2, 2-1, 1-2. Dies ist eigentlich so etwas wie 2-1, 2-3, 1-3, 2-4, 3-4, 2-2, 2-1, 2-1 (das gleiche Paar wieder?), 4-1, 3 -1, 1-1, 2-2. Dies gibt 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0 zurück. –