2014-01-30 109 views
1

下面的代碼:爲什麼SplPriorityQueue鍵被顛倒?

$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

內部'splPriorityQueue'作爲數字索引數組 –

回答

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(); 
} 
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

+0

實現隊列實現Iterator接口所以可以用foreach循環遍歷它。這個while循環模式看起來更乏味。 – NikitaObukhov

+0

@NikitaObukhov'\ SplPriorityQueue'實現'Iterator','Traversable'。 – kaiser

相關問題