2

给出以下代码:

$tree = array();
$node =& $tree[];
// imagine tons of code that populates $tree here

如何通过引用$node完全删除 ZVAL点?这甚至可能吗?

使用unset(),只有引用被破坏,而不是节点$tree本身:

unset($node);
print_r($tree);

// outputs:
Array
(
    [0] => 
)

我知道这是预期的行为,unset($reference)我也知道 ZVAL refcounter 的工作原理。

但我真的需要在特定极端情况下处理后删除该节点。

我可以以某种方式找到正确的数组索引并直接取消设置数组元素unset($tree[$node_index])吗?

免责声明:上面的例子是缩小和隔离的。实际上,我正在为一个非常丑陋的嵌套表数据结构修改一个复杂的解析器,它以流的形式呈现。该代码大量使用指针作为反向引用,我想避免重构整个代码。

4

1 回答 1

2

如果您获取对数组元素的引用并取消设置该引用,则该数组根本不会受到影响——这就是unset工作原理,并且这种行为是不可协商的。

您需要做的是记住相关元素的键,然后unset直接在数组上:

$tree = array();
$tree[] = 'whatever';

end($tree);
$key = key($tree);

// ...later on...

unset($tree[$key]);

当然,这非常难看,它需要您同时保留$tree(或对它的引用)和$key周围。你可以通过将 unset 操作打包到一个匿名函数中来缓解这种情况——如果你很有可能稍后扣动扳机,那么便利可以抵消额外的资源消耗:

$tree = array();
$tree[] = 'whatever';

end($tree);
$key = key($tree);

$killThisItem = function() use(&$tree, $key) { unset($tree[$key]); } ;

// ...later on...

$killThisItem();
于 2013-09-03T10:09:17.330 回答