Php SplPriorityQueue::next()正在删除该项

Php SplPriorityQueue::next()正在删除该项,php,iterator,next,spl,Php,Iterator,Next,Spl,我想知道如何多次迭代SplHeap或SplPriorityQueue 方法删除最后一项,因此第二个foreach(或for)不会得到任何结果 例如: <?php class Teste extends SplPriorityQueue {} $teste = new Teste(); $teste->insert( 'A', 1 ); $teste->insert( 'B', 3 ); $teste->insert( 'D', 5 ); $teste->inser

我想知道如何多次迭代SplHeap或SplPriorityQueue

方法删除最后一项,因此第二个foreach(或for)不会得到任何结果

例如:

<?php
class Teste extends SplPriorityQueue {}

$teste = new Teste();
$teste->insert( 'A', 1 );
$teste->insert( 'B', 3 );
$teste->insert( 'D', 5 );
$teste->insert( 'C', 2 );
$teste->insert( 'A', 4 );

echo '<pre>';

var_dump( $teste->count() );

echo '<br>';

foreach( $teste as $t )
    var_dump( $t );

echo '<br>';

var_dump( $teste->count() );

我想知道如何多次迭代SplHeap或SplPriorityQueue

简单的回答是,对于类的单个实例,您不会迭代多次

稍微长一点的答案是在迭代时使用多个相同的实例。这可以通过迭代heap/pqueue的
克隆来轻松实现

快速示例

int(3)
string(1) "A"
string(1) "B"
string(1) "C"
int(3)
string(1) "A"
string(1) "B"
string(1) "C"
int(3)

谢谢你的回复。但是,如果我想像SplHeap使用compare()方法那样,对自动排序的对象使用SplObjectStorage,该怎么办呢?我不是100%清楚你在问什么,但你应该能够毫无问题地完成上述操作。
<?php

$queue = new SplPriorityQueue();
$queue ->insert('A', 30);
$queue ->insert('C', 10);
$queue ->insert('B', 20);

var_dump(count($queue));
foreach (clone $queue as $item) {
    var_dump($item);
}
var_dump(count($queue));
foreach (clone $queue as $item) {
    var_dump($item);
}
var_dump(count($queue));
int(3)
string(1) "A"
string(1) "B"
string(1) "C"
int(3)
string(1) "A"
string(1) "B"
string(1) "C"
int(3)