SplHeap の本質は、挿入されたすべての値 (オブジェクトなど) を自動的に並べ替え、反復処理を行うと、すべての値がヒープから削除されることです。
ヒープを複製すると、挿入された値もコピーされますが、オブジェクトは複製されず、期待どおり参照としてコピーされます。
通常のアプローチは、保存されたデータを繰り返し処理し、見つかったすべてのオブジェクトを複製することです。ただし、反復するとノードが削除されるため、ノードをどこかに収集して再挿入する必要があります。
「次を手に入れる」しかないので、順番に選択肢はありません。
パフォーマンスが気になる場合は、測定してください。
このコードが機能していることがわかりました:
class MyHeap extends SplHeap
{
public function compare($a, $b)
{
return (strcmp(get_class($a), get_class($b)));
}
public function __clone()
{
echo "Im cloning in ";
foreach ($this as $obj) {
$clones[] = clone($obj);
}
foreach ($clones as $obj) {
$this->insert($obj);
}
var_dump($this);
}
}
$heap = new MyHeap();
$obj1 = new stdClass();
$heap->insert($obj1);
$obj2 = new stdClass();
$heap->insert($obj2);
var_dump($heap);
$clone = clone($heap);
var_dump($clone);
foreach ($clone as $insert) {
var_dump($insert);
}
foreach ($heap as $insert) {
var_dump($insert);
}
出力:
class MyHeap#1 (0) {
}
Im cloning in class MyHeap#4 (0) {
}
class MyHeap#4 (0) {
}
class stdClass#6 (0) {
}
class stdClass#7 (0) {
}
class stdClass#2 (0) {
}
class stdClass#3 (0) {
}