私は、ツリーを通るパスを格納するためにスタックとして使用している配列を持っています。各要素はツリー内のノードを指しています。最後の要素をポップしてから、その要素が参照するオブジェクトをnullに設定します。基本的にはPHPで参照を間接参照することはできますか?
:
$node = array_pop($path);
*$node = null;
はCっぽい言語がそうであるようにPHPが '*' 演算子を持っていたと仮定。私はパスを含む配列がで作成されるため、これは醜いと言う
if($goLeft) {
$parent->left = null;
} else {
$parent->right = null;
}
:のように今私は私が撮った子の親ノードと思い出すから始まり、その後、nullにその設定の醜いソリューションを持っています私のツリークラスのパブリック関数。私は、PHPの特質(?)を扱う実装の詳細を公開することなく、ツリーのパス内のノードで直接作業する能力を公開したいと思います。 ATM戻り値(この場合は$ goLeft)にブール値を含める必要があるため、参照を参照解除することができない場合があります。
これは私がこの問題に遭遇したときの2回目です。だから、誰かが私がコードの最初のブロックに似た何かをする方法を知っていたら、共有してください!
(EDIT)
&年代と配列の多くの順列を使って実験した後に、それは基本的な問題は、私は私がなっていたエラーの理由を誤解していたことだったことが判明。
私は
$a = ($x > $y) ? &$foo[$bar] : $blah;
を試してみましたが、 "構文エラー、予期しない '&'" を得ました。これは、問題が$foo[$bar]
の&オペレーターを使用していたことを意味しています。実際には、犯人は?オペレーターであることが判明しました。
if($x > $y) {
$a = &$foo[$bar];
} else {
$a = null;
}
は完璧に機能します。私はこうして、存在しなかった問題の回避策を探している野生のガチョウの追跡に行きました。私が&のチェーンを壊さない限り、PHPは私が望むものを実行します。これは、変数(変数自体ではない)によって参照されるオブジェクトを操作することです。私をめちゃめちゃに何例
$a1 = new SomeClass;
$a2 = &$a1;
$a3 = &$a2;
$a4 = &$a3;
$a4 = 42; // This actually sets $a1 to 42
var_dump($a1); // Emits 42
は、私は(これは間違っている)オブジェクトがとにかく参照によって周り渡されると思ったので、私は表現がオブジェクトに解決場合&が必要だったとは思いませんでしたということです。つまり、
class A {
public $b;
}
class B {}
$a = new A;
$a->b = new B;
$c1 = $a->b;
$c2 = &$a->b;
$c1 = 42; // Merely assigns 42 to $c1
$c2 = 42; // Assigns 42 to $a->b
この正確な問題はhttp://www.php.net/manual/en/language.oop5.references.phpで解決されています。初めて読んだときに沈んだことを願います!
これはあなたが望むものですが、 '$ parent-> left = null;の代わりに' unset($ parent-> left); 'を使うことができます。 – Leri
@PLB: unset'ではなく、 'unlink'を実行します。 –
@Rocketもちろん、します。私はとても疲れている。 – Leri