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) {
}