Я хотел бы знать, как я мог бы повторять 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
Спасибо!
Я хотел бы знать, как я мог бы повторять 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)
Других решений пока нет …