Gibt es eine Möglichkeit, die Sortierung von Ganzzahlen oder Strings in einer Instanz der Klasse SplFixedArray
durchzuführen? Ist das Konvertieren in array
eines PHP, Sortieren und dann zurück konvertieren die einzige Option?Wie sortiere ich ein SplFixedArray?
Antwort
Zunächst herzlichen Glückwunsch zum Finden und Verwenden von SplFixedArrays! Ich denke, sie sind ein stark unterausgenutztes Feature in Vanilla PHP ...
Wie Sie wahrscheinlich geschätzt haben, ist ihre Leistung unübertroffen (im Vergleich zu den üblichen PHP-Arrays) - aber das kommt zu einigen Kompromissen , einschließlich eines Mangels an PHP-Funktionen, um sie zu sortieren (was eine Schande ist)!
Die Implementierung Ihrer eigenen Blasensortierung ist eine relativ einfache und effiziente Lösung. Iterieren Sie einfach durch und schauen Sie sich die einzelnen aufeinander folgenden Elemente an. Spülen und wiederholen, bis das Array sortiert ist:
<?php
$arr = new SplFixedArray(10);
$arr[0] = 2345;
$arr[1] = 314;
$arr[2] = 3666;
$arr[3] = 93;
$arr[4] = 7542;
$arr[5] = 4253;
$arr[6] = 2343;
$arr[7] = 32;
$arr[8] = 6324;
$arr[9] = 1;
$moved = 0;
while ($moved < sizeof($arr) - 1) {
$i = 0;
while ($i < sizeof($arr) - 1 - $moved) {
if ($arr[$i] > $arr[$i + 1]) {
$tmp = $arr[$i + 1];
$arr[$i + 1] = $arr[$i];
$arr[$i] = $tmp;
}
$i++;
var_dump ($arr);
}
$moved++;
}
Es ist nicht schnell, es ist nicht effizient. Sie können Quicksort dafür in Betracht ziehen - es gibt dokumentierte Online-Beispiele, einschließlich dieses unter wikibooks.org (müssen geändert werden, um mit SplFixedArrays zu arbeiten).
Ernsthaft, abgesehen davon, dass Ihre Frage beantwortet wird, fühle ich wirklich, dass Sie sich zwingen zu fragen, warum Dinge wie SplFixedArray existieren und sich zwingen zu verstehen, was hinter einem "Quick Call to array_sort()
" passiert (und warum es schnell sehr lange dauert Zeit zu laufen) machen den Unterschied zwischen Programmierern und Programmierern. Ich applaudiere deine Frage!
Blind Blase Art mit für 'SplFixedArray' könnte eine Idee wert sein, die alle Vorteile der Verwendung eines festen Arrays als solches beseitigt. Genau prüfen, wie viele Fälle [abgedeckt] (https://github.com/php/php-src/blob/250938e2d35fc54161a18167b7901c5e3b574371/Zend/zend_sort.c) von PHP selbst (na ja, in 7.x-Zweig). – mente
Ich habe einmal einen Quicksort auf einem SplFixedArray implementiert, um herauszufinden, was der Performance-Hit wäre. Während ich mein Bestes tat, um den Algorithmus zu optimieren, fiel das gesamte Experiment kurz allein durch den Overhead von PHP selbst. – Flosculus
@Flosculus - Sind Sie bereit, den Code hier, oder in Pastebin oder etwas zu schreiben? Ich wäre wirklich interessiert zu sehen, was du getan hast - und deine Leistungsergebnisse zu sehen. – wally
Hier ist meine Anpassung der Bubble-Sortierung mit splFixedArrays. In PHP 7 ist dieses einfache Programm doppelt so schnell wie das normale bubblesort
function bubbleSort(SplFixedArray $a)
{
$len = $a->getSize() - 1;
$sorted = false;
while (!$sorted) {
$sorted = true;
for ($i = 0; $i < $len; $i++)
{
$current = $a->offsetGet($i);
$next = $a->offsetGet($i + 1);
if ($next < $current) {
$a->offsetSet($i, $next);
$a->offsetSet($i + 1, $current);
$sorted = false;
}
}
}
return $a
}
$starttime = microtime(true);
$array = SplFixedArray::fromArray([3,4,1,3,5,1,92,2,4124,424,52,12]);
$array = bubbleSort($array);
print_r($array->toArray());
echo (microtime(true) - $starttime) * 1000, PHP_EOL;
Ja. Die nativen Sortierfunktionen von PHP funktionieren nicht auf Objekt-Arrays. Sie müssen die Umgehung oder eine manuelle Codierung: http://phppowercoding.com/the-speed-issue-or-alternately-why-a-php-implemented-quicksorts-not-so-quick/397 – mario