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.

Это обычно не проблема, но в этом случае я не знаю схему массива $vars, поэтому я не могу написать оператор foreach на основе фиксированного количества ключей. Я также не могу просто сделать $vars общедоступным, потому что функция должна что-то делать в объекте каждый раз, когда что-то изменяется.

Я обеспокоен тем, что это рекурсивный сценарий, который предполагает использование 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

Смежные вопросы