Signatur
Beschreibung
SplMaxHeap ist eine konkrete Implementierung der abstrakten Klasse SplHeap und realisiert einen maximalen Heap: Das Element mit dem höchsten Wert steht immer an der Spitze der Datenstruktur und wird beim Aufruf von extract() als erstes zurückgegeben. Die interne Sortierung erfolgt automatisch beim Einfügen.
Typische Einsatzgebiete sind Prioritätswarteschlangen, bei denen hochpriorisierte Aufgaben zuerst verarbeitet werden sollen, sowie Algorithmen wie Heapsort, Dijkstras kürzeste Pfade oder Scheduling-Aufgaben. Im Vergleich zu einem manuell sortierten Array bietet SplMaxHeap eine effizientere O(log n)-Einfüge- und Entnahme-Komplexität.
Die Klasse überschreibt die abstrakte Methode compare() aus SplHeap so, dass größere Werte bevorzugt werden. Für skalare Typen (Zahlen, Strings) funktioniert dies direkt; für Objekte oder komplexe Vergleiche empfiehlt es sich, SplMaxHeap zu erweitern und compare() selbst zu überschreiben.
Wichtig: SplMaxHeap ist kein Iterator über alle Elemente in der ursprünglichen Einfügereihenfolge – beim Iterieren werden Elemente der Reihe nach extrahiert, d. h. der Heap wird dabei geleert.
Beispiele
Grundlegende Verwendung mit Ganzzahlen
<?php
$heap = new SplMaxHeap();
$heap->insert(10);
$heap->insert(3);
$heap->insert(75);
$heap->insert(42);
$heap->insert(7);
echo 'Größtes Element: ' . $heap->top() . PHP_EOL;
while (!$heap->isEmpty()) {
echo $heap->extract() . PHP_EOL;
}
Prioritätswarteschlange für Aufgaben
<?php
class TaskHeap extends SplMaxHeap
{
protected function compare(mixed $value1, mixed $value2): int
{
return $value1['priority'] <=> $value2['priority'];
}
}
$queue = new TaskHeap();
$queue->insert(['name' => 'E-Mail versenden', 'priority' => 1]);
$queue->insert(['name' => 'Datenbank-Backup', 'priority' => 3]);
$queue->insert(['name' => 'Cache leeren', 'priority' => 2]);
$queue->insert(['name' => 'Sicherheits-Patch', 'priority' => 5]);
$queue->insert(['name' => 'Log-Dateien rotieren','priority' => 4]);
echo 'Aufgaben nach Priorität (höchste zuerst):' . PHP_EOL;
while (!$queue->isEmpty()) {
$task = $queue->extract();
printf("[%d] %s\n", $task['priority'], $task['name']);
}
// Wichtig · Fallstricke
Heap wird beim Iterieren geleert: Das Durchlaufen eines SplMaxHeap via foreach oder wiederholtem extract() entfernt die Elemente dauerhaft. Soll der Heap erhalten bleiben, muss er vorher geklont werden (clone $heap).
Vergleich inkompatibler Typen: Beim Einfügen von Werten unterschiedlicher, nicht direkt vergleichbarer Typen (z. B. gemischte Arrays und Skalare ohne eigene compare()-Implementierung) kann eine RuntimeException geworfen werden.
Kein wahlfreier Zugriff: SplMaxHeap unterstützt keinen Index-basierten Zugriff auf beliebige Elemente – nur top() (Spitze lesen) und extract() (Spitze entnehmen) sind effizient verfügbar.