我可以获得帮助,知道这是否可行?
我想动态选择数组。
例如,
$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;
非常感谢。
答案 0 :(得分: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"
答案 1 :(得分:2)
简短回答:不。
答案很长:
您是否正在寻找references?好吧,可能不是。
在任何情况下,你最好自己编写一套类或函数,例如:
setUsingPath($oj, 'A->B->C->D', $x);
$x = getUsingPath($oj, $E);
但是如果你确定你想要的是(未指明的)问题的最佳解决方案,并且$E = 'A->B'; $oj->E...
是要使用的语法,那么应该可以使用 shudder {{ 3}}。一组递归颤抖 magic methods应该可以解决问题。