4

これが可能かどうかを知るために助けを求めることはできますか?

配列を動的に選択したい。

例えば、

$oj = (object)['A' => (object)['B' => (object)['C' => (object)['D' => []]]]]

$E = 'A'
$oj->$E // this will work

$E = 'A->B'  
$oj->$E // this will not work

フルパスを書く以外に何ができますか? または、これが可能かどうか教えてください。または、参照できる例はありますか?

$oj[A][B][C][D]     <---NO
$oj->A->B->C->D     <---NO

$E = A->B->C->D    
$oj->E              <--What I want   


Question Update: 

$oj->E = 'Store something'  <-What I want, then will store into $oj.

//So E here is not pick up the value of D, but the path of D;

どうもありがとうございました。

4

2 に答える 2

3

パスを分解し、パス->の一部ごとにオブジェクトをトレースできます。

function getPath($obj,$path) {
  foreach(explode('->',$path) as $part) $obj = $obj->$part;
  return $obj;
}

$oj = (object)['A' => (object)['B' => (object)['C' => (object)['D' => []]]]];
$E = 'A->B->C->D';
getPath($oj,$E);

書きたい場合は、醜いですが、次を使用して簡単な方法で行うことができますeval

eval("\$tgt=&\$oj->$E;"); // $tgt is the adress of $oj->A->B->C->D->E
print_r($tgt); // original value of $oj->A->B->C->D->E
$tgt = "foo"; 
print_r($oj); // $oj->A->B->C->D->E = "foo"
于 2013-11-14T23:48:06.887 に答える
2

簡単な答え: いいえ。

長い答え:

おそらく参照を探していますか?わかりました、おそらくそうではありません。

いずれにせよ、おそらく独自のクラスまたは関数のセットを作成する方がよいでしょう。たとえば、次のようになります。

setUsingPath($oj, 'A->B->C->D', $x);
$x = getUsingPath($oj, $E);

しかし、あなたが望むものが(特定されていない)問題に対する最良の解決策であり、使用する構文であると確信している場合は、震えの魔法の方法$E = 'A->B'; $oj->E...で可能になるはずです。再帰的なshudderのセットでうまくいくはずです。 __get()

于 2013-11-15T00:28:01.137 に答える