2017-04-05 3 views
0

이 클래스 내에서 SplPriorityQueue를 구현 중입니다. 이 클래스에는 본질적으로 PDOStatement 객체를 올바른 우선 순위와 함께 넣는 메소드가 포함되어 있습니다. 그런 다음 큐에있는 모든 PDOStatement 객체를 실행하는 메소드가 있습니다.빈 힙에서 추출 할 수 없습니다.

이 클래스를 테스트 할 때 하나의 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 코드의 부분 집합 (필자는 PriorityQueue 인의 초기화시 추출물 플래그는 '모두'로 설정된)입니다 추출 된 노드 배열 ([data] => PDOStatement 객체 ([queryString] => [--omitted--]) [priority] => 4) 이것은 추출 된 노드입니다

치명적인 오류 : 캐치되지 않은 예외 'RuntimeException' '빈에서 추출 할 수 없습니다. heap 'in ... on line 943

충분한 정보를 제공했으면 좋겠다. 나는 학생이므로이 문제가 극히 분명하지 않기를 바란다.

+0

을 당신이'대신'의 $의 top'를 사용할 필요가 있다고 생각 $ this-> queries_to_run-> 추출()' –

+0

나는 실제로에서 쿼리를 제거 할 필요를 제외시켰다 것 대기열 및'top()'는 단순히 대기열을 들여다 봅니다. – daniel1171

답변

0

각 반복 후에 PriorityQueue가 비어 있는지 확인하지 못하는 것이 오류였다. 단순히이 고정 된 다음에 삽입 :

$top = ($this->queries_to_run->isEmpty()) ? 0 : $this->queries_to_run->top(); 
관련 문제