以下代码:
$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
是错误还是错过了什么?
答案 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();
}