2

次のコードが与えられた場合:

$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])か?

免責事項: 上記の例は縮小され、分離されています。実際には、ストリームとして表示される非常に醜いネストされたテーブル データ構造の複雑なパーサーを変更しています。コードは後方参照としてポインターを多用しているため、コード全体のリファクタリングは避けたいと考えています。

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 に答える