为什么SplPriorityQueue键被反转?

时间:2014-01-30 02:51:34

标签: php

以下代码:

$queue = new \SplPriorityQueue();
$queue->insert('a', 4);
$queue->insert('b', 3);
$queue->insert('d', 1);
$queue->insert('c', 2);
foreach($queue as $key => $value) {
  print "$key:$value\n";
}

输出:

3:a 
2:b 
1:c 
0:d

预期行为:

0:a 
1:b 
2:c 
3:d

是错误还是错过了什么?

2 个答案:

答案 0 :(得分:1)

不要使用foreach迭代优先级队列并担心类如何在内部存储数据,而是尝试使用SPLPriorityQueue类中内置的方法:

while($queue->valid()){ 
    print_r($queue->current()); 
    echo "<BR>"; 
    $queue->next(); 
} 

(修改后的例子取自php.net上的用户提交:http://us2.php.net/manual/en/class.splpriorityqueue.php

答案 1 :(得分:1)

为什么你期望数字键从0开始?因为这是我们习惯于使用数组看到的。

对于向上计数的阵列是理想的。但是对于队列,尤其是我们将允许未知优先级插入的优先级队列,max heap is ideal。实际上,只有在开始从队列中删除项目时才会应用键/值约定。它向下计数以模拟最大堆。

在本地,您会更接近这一点:https://eval.in/96293

Array
(
    [data] => a
    [priority] => 9
)
Array
(
    [data] => b
    [priority] => 3
)
Array
(
    [data] => c
    [priority] => 2
)
Array
(
    [data] => d
    [priority] => 1
)

这是由此创建的:

$queue->setExtractFlags(SplPriorityQueue::EXTR_BOTH); 
while($queue->valid()){ 
    print_r($queue->current()); 
    $queue->next(); 
}