2017-04-05 74 views
0

我正在此类中实现SplPriorityQueue。该类包含基本上将PDOStatement对象与正确优先级一起放置的方法。然后我有一个方法来执行队列中的所有PDOStatement对象。无法从空堆中提取

测试此类时,我已将一个PDOStatement对象插入队列,然后打印出$this->queries_to_run->extract()的结果。在这样做的时候,我得到了我的预期结果,但也是一个RuntimeExeption与消息“不能从一个空的堆中提取”。我知道SplPriorityQueue本质上是一个堆,但我不知道为什么我得到了我的预期结果和异常。

这里是麻烦的PHP代码的子集(我有提取标志设置为“两个”在时Queue的初始化):

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

这是我的输出:

这是提取的节点 数组([data] => PDOStatement对象([queryString] => [--omitted--])[priority] => 4)这是提取的节点

致命错误:Uncaught exception'RuntimeException'与消息'不能从空的提取堆...在线943

我希望我已经提供了足够的信息。我是一名学生,所以我希望这个问题不是非常明显

+0

我认为你需要使用'$ top',而不是'$这个 - > queries_to_run->提取物()' –

+0

我想除了我需要真正删除从查询队列和'top()'只是在队列中窥视。 – daniel1171

回答

0

错误来自于不检查每次迭代后PriorityQueue是否为空。只需插入以下固定它:

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