给出以下代码:
$tree = array();
$node =& $tree[];
// imagine tons of code that populates $tree here
如何通过引用完全删除ZVAL $node
指向?这甚至可能吗?
使用unset()
,只会销毁引用,而不会销毁$tree
本身中的节点:
unset($node);
print_r($tree);
// outputs:
Array
(
[0] =>
)
我知道这是unset($reference)
的预期行为,我也知道ZVAL refcounter是如何工作的。
但我确实需要在处理特定极端情况后删除该节点。
我可以以某种方式找到正确的数组索引并直接取消设置数组元素,如unset($tree[$node_index])
吗?
免责声明:以上示例已缩小并隔离。实际上我正在为一个非常丑陋的嵌套表数据结构修改一个复杂的解析器,它以流形式呈现。代码大量使用指针作为反向引用,我想避免重构整个代码。
答案 0 :(得分:2)
如果您获取对数组元素的引用并取消设置引用,则该数组将不会受到影响 - 这就是unset
的工作原理,并且此行为无法协商。
您需要做的是记住相关元素的关键点,然后直接在数组上记住unset
:
$tree = array();
$tree[] = 'whatever';
end($tree);
$key = key($tree);
// ...later on...
unset($tree[$key]);
当然这非常难看,它要求您同时保留$tree
(或引用)和$key
。您可以通过将未设置的操作打包到匿名函数中来缓解这种情况 - 如果 很有可能在以后触发触发器,那么便利性可以抵消额外的资源消耗:
$tree = array();
$tree[] = 'whatever';
end($tree);
$key = key($tree);
$killThisItem = function() use(&$tree, $key) { unset($tree[$key]); } ;
// ...later on...
$killThisItem();