2017-04-05 10 views
0

私はこのクラス内でSplPriorityQueueを実装しています。このクラスには、本質的にPDOStatementオブジェクトを正しい優先度と共に配置するメソッドが含まれています。次に、キュー内のすべてのPDOStatementオブジェクトを実行するメソッドがあります。空のヒープからは抽出できません

このクラスをテストするときに、1つのPDOStatementオブジェクトをキューにプッシュしてから、$this->queries_to_run->extract()の結果を出力しました。これを実行すると、期待どおりの結果が得られますが、RuntimeExeptionに「空のヒープからは抽出できません」というメッセージが表示されます。私は、SplPriorityQueueが本質的にはボンネット内のヒープであることを認識していますが、なぜ私が期待した結果と例外を両方取得しているのかわかりません。

これは次のとおりです。これは私の出力である

$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 
} 

:ここ

は煩わしいPHPコードのサブセット(Iは、優先度つきキューの初期化時に抽出フラグが「両方」に設定されている)であります抽出されたノード 配列([data] => PDOStatementオブジェクト([queryString] => [--omitted--])[優先度] => 4)これは抽出ノードです

致命的なエラー:キャッチされない例外 'RuntimeException'メッセージ '空ではないheap 'in ...行943

私は十分な情報を提供したいと思います。私は学生ですから、この問題が非常に明白でないことを願っています。

+0

私はあなたが私は私が実際にクエリを削除する必要があります除く外でしょう '$のtop'の代わりに、'ます$ this-> queries_to_run->抽出() ' –

+0

を使用する必要があると思う:単に次はそれを修正挿入キュー、および 'top()'は単にキューを見るだけです。 – daniel1171

答えて

0

エラーは、各繰り返しの後でPriorityQueueが空であるかどうかをチェックしていないためです。

$top = ($this->queries_to_run->isEmpty()) ? 0 : $this->queries_to_run->top(); 
関連する問題