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

时间:2014-12-13 21:52:45

标签: php iterator next spl

我想知道如何不止一次迭代SplHeap或SplPriorityQueue。

next()方法删除最后一项,因此第二个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() );

返回:

int(5)

string(1) "D"
string(1) "A"
string(1) "B"
string(1) "C"
string(1) "A"

int(0) <--- I need this to still be 5

我需要根据compare()方法插入项目,如下所示:http://php.net/manual/en/splheap.compare.php

谢谢!

1 个答案:

答案 0 :(得分:5)

  

我想知道如何不止一次迭代SplHeap或SplPriorityQueue。

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

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

Quicky示例

<?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)