2016-05-15 3 views
0

関数入力に基づいてオブジェクト内の連想配列を更新できるようにしたいのですが、これを行う方法が失われています。ここに私の問題がある。PHP:クラス関数を使用して連想配列を更新していますか?

private $vars = Array 
(
    ['user_info'] = Array 
    (
    ['name'] => 'John Doe' 
    ['id'] => 46338945 
    ['email'] => '[email protected]' 
    ['age'] => 35 
) 
    ['session_info'] = Array 
    (
    ['name'] => 'session_name' 
    ['id'] => 'mGh44Jf0nfNNFmm' 
) 
) 

と私はこれらの値を変更するパブリック関数updateを持っている:のは私のオブジェクトでこのデータコンテナがあるとしましょう

public function update($keys, $changeValueTo) { 
    if (!is_array($keys)) { 
    $keys = array($keys); 
    } 
    nowWhat(); 
} 

は最終的に、私はちょうどこのような何かを変換することができるようにしたい

この中
array('user_info', 'name') 

$this->vars['user_info']['name'] 

ですので、$equalToと同じに設定することができます。

これは通常問題ではありませんが、このシナリオでは配列のスキーマはわかりませんので、固定数のキーに基づいてforeachステートメントを記述することはできません。 $varsをpublicにすることはできません。何かが変更されるたびにオブジェクト内で何かを行う必要があるからです。

私はこれがeval()に頼る再帰的シナリオであると心配しています。あなたは何をお勧めします?

答えて

1

これは難しくありません。達成するためには、参照とループで変数を渡す必要があります。不要eval()

$var = array(
    "user_info" => array(
     "name" => "Visal" 
    ) 
); 

function update(&$var, $key, $value) { 
    // assuming the $key is an array 
    $t = &$var; 
    foreach ($key as $v) { 
     $t = &$t[$v]; 
    } 

    $t = $value; 
} 

update($var, array("user_info", "name"), "Hello World"); 
var_dump($var); 
+0

変数を参照渡しすることが何を意味するのかはまだ不明ですが、私はそのことについていくつかの研究を行う必要があります。ありがとう! – Jonesy

関連する問題