2016-11-02 41 views
0

我認爲解釋我的問題的最好方法就是舉一個例子。說我有以下的對象。如何通過數組值創建嵌套類值

$data=new stdClass; 
$data->test=new stdClass; 
$data->test->test2=6; 
$data->s=array('b',6,7); 

我想知道如何讀取或更改給定鍵值的數組中的任何值作爲數組。

我知道下面將無法正常工作:

function doSomething($inputArray1,$inputArray2) { 
    $data[ $inputArray1 ]; //6 
    $data[ $inputArray2 ]=4; //was array('b',6,7); 
} 

//someone else provided 
doSomething(array('test','test2') , array('s') ); 

改明確指出,我不知道數組的親自所以使用 $data->test->test2;拿到6像我通常會在值不會工作。也不知道數組的長度。

+0

你想改變的對象數組值? '$ DATA-> S [2]'? – Darren

回答

1

想通了:

$parts=array('test','test2'); 


$ref=&$data; 
foreach($parts as $part) { 
    if (is_array($ref)) { 
     $ref=&$ref[$part]; //refrence next level if array 
    } else { 
     $ref=&$ref->$part; //refrence next level if object 
    } 
} 
echo $ref; //show value refrenced by array 
$ref=4; //change value refrenced by array(surprised this works instead of making $ref=4 and breaking the refrence) 
unset($ref); //get rid of refrence to prevent accidental setting. Thanks @mpyw 
+1

完成任務後,強烈建議執行'unset($ ref);'。 – mpyw

+0

謝謝@mpyw我相信這會導致我所有的頭痛。 –

0

正如我在評論中指出,需要按計劃訪問對象/數組。 他們的符號如下;

  • 對象:->
  • 陣:[]

所以,帶您已經生成您的$data數組,你必須訪問對象/陣列組合,例如:

echo $data->s[2]; 

Example/Demo

如果你要訪問的初始test/test2 itteration(被設置爲一個對象->),那麼你需要訪問它作爲一個對象:

echo $data->test->test2; 
+0

這就是我通常會這樣做,如果我知道數組中的值。我不。 –