无法从空堆中提取

时间:2017-04-05 03:45:29

标签: php pdo

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

测试此类时,我已将一个PDOStatement对象推入队列,然后从$this->queries_to_run->extract()打印结果。执行此操作后,我得到了我的预期结果,但也是RuntimeExeption,其中包含“无法从空堆中提取”的消息。我知道SplPriorityQueue本质上是一个堆下的堆,但我不知道为什么我得到我的预期结果和异常。

这是烦人的PHP代码的子集(我在初始化PriorityQueue时将提取标志设置为'both'):

$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)这是提取的节点

致命错误:未捕获的异常'RuntimeException',在第943行的消息'无法从空堆中提取'

我希望我提供了足够的信息。我是学生,所以我希望这个问题不是很明显

1 个答案:

答案 0 :(得分:0)

错误来自于在每次迭代后没有检查PriorityQueue是否为空。只需插入以下内容即可修复:

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