2017-04-05 2 views
0

Ich implementiere eine SplPriorityQueue innerhalb dieser Klasse. Die Klasse enthält Methoden, um PDOStatement-Objekte im Wesentlichen mit der richtigen Priorität zu versehen. Ich habe dann eine Methode, die alle PDOStorement-Objekte in der Warteschlange ausführt.Kann nicht aus einem leeren Heap extrahieren

Beim Testen dieser Klasse habe ich ein PDOStatement-Objekt in die Warteschlange geschoben und dann drucke ich die Ergebnisse von $this->queries_to_run->extract(). Auf diese Weise bekomme ich mein erwartetes Ergebnis, aber auch eine RuntimeExeption mit der Nachricht "Kann nicht aus einem leeren Haufen extrahieren." Ich bin mir bewusst, dass die SplPriorityQueue im Wesentlichen ein Haufen unter der Haube ist, aber ich weiß nicht, warum ich sowohl mein erwartetes Ergebnis als auch die Ausnahme bekomme. Hier

ist die Teilmenge des lästigen PHP-Code (Ich habe die Extrakt-Flags auf ‚beide‘ bei der Initialisierung der Priorityqueue):

$top = $this->queries_to_run->top(); 
//print_r($top); // Debug 

while($top['priority'] === self::$UPDATE_PRIORITY || $top['priority'] === self::$REMOVAL_PRIORITY) { 
    print("This is the extracted node\n"); // Debug 
    print_r($this->queries_to_run->extract()); // Debug 
} 

Das ist meine Ausgabe lautet:

Dies ist extrahierter Knoten Array ([Daten] => PDOStatement Objekt ([queryString] => [--omited--]) [Priorität] => 4) Dies ist der extrahierte Knoten

Fataler Fehler: Uncaught Ausnahme 'RuntimeException' mit der Nachricht 'Kann nicht aus einem leeren extrahieren Heap 'in ... on line 943

Ich hoffe, ich habe genug Informationen zur Verfügung gestellt. Ich bin ein Student, also hoffe ich, dass dieses Problem nicht sehr offensichtlich ist

+0

ich glaube, Sie '$ top' statt' $ this-> queries_to_run-> extract() ' –

+0

verwenden müssen, würde ich außer ich brauche, um tatsächlich die Abfrage aus dem entfernen Warteschlange und 'top()' guckt einfach auf die Warteschlange. – daniel1171

Antwort

0

Der Fehler wurde von nicht überprüft, ob die PriorityQueue nach jeder Iteration leer war. Einfaches Einsetzen der es befestigt ist folgende:

$top = ($this->queries_to_run->isEmpty()) ? 0 : $this->queries_to_run->top(); 
Verwandte Themen