SplPriorityQueue :: 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() );

Возвращает:

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

Спасибо!

4

Решение

Я хотел бы знать, как я мог бы повторять SplHeap или SplPriorityQueue более одного раза.

Короткий ответ: вы не повторяете более одного раза для отдельного экземпляра класса.

Немного более длинный ответ — вместо этого использовать несколько идентичных экземпляров при итерации. Это может быть легко достигнуто путем итерации по clone кучи / пику.

Быстрый пример

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]