Mat*_*res 4 php spl iterator next
我想知道如何不止一次迭代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() );
Run Code Online (Sandbox Code Playgroud)
返回:
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
Run Code Online (Sandbox Code Playgroud)
我需要基于compare()方法插入项目,如下所示:http://php.net/manual/en/splheap.compare.php
谢谢!
我想知道如何不止一次迭代SplHeap或SplPriorityQueue.
简短的回答是,对于类的单个实例,不要多次迭代.
稍微长一点的答案是在迭代时使用多个相同的实例.这可以通过迭代clone堆/ pqueue 来轻松实现.
快速的例子
<?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));
Run Code Online (Sandbox Code Playgroud)
以上输出:
int(3)
string(1) "A"
string(1) "B"
string(1) "C"
int(3)
string(1) "A"
string(1) "B"
string(1) "C"
int(3)
Run Code Online (Sandbox Code Playgroud)