2014-12-13 3 views
3

Я хотел бы знать, как я могу повторять SplHeap или SplPriorityQueue более одного раза.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 

Мне нужно вставить элементы, основанные на методе сравнения(), например: http://php.net/manual/en/splheap.compare.php

Спасибо!

ответ

4

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

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

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

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) 
+0

спасибо за Ваш ответ. Но что, если я хотел использовать SplObjectStorage с автоматически отсортированными объектами, например, SplHeap делает с помощью метода compare()? –

+0

Я не на 100% понят, что вы просите, но вы можете сделать это без проблем. – salathe