Переопределение элемента в многмерном массиве и вывод массива.

Beginner.83

Новичок
Задача следующая есть многомерный массив:
PHP:
$data = array( 
'elem_1' => array(
 'elem_2' => array(
   'elem_3' = 'string'
  )
 )
);
необходимо написать функцию которая переопределяет по ключу данные массива
скажем set('elem_1.elem_2.elem_3', 'новое значение') и выводит массив с новыми значениями.

PHP:
function set($name, $value)
{
        $names = explode('.', $name);
        $count = count($names)-1;
        $data = self::$instance->data;
        $result = array();
        foreach ($names as $key=>$val){
            if (!isset($data[$val])) return false;
            if($key == $count) {
                $data[$val] = $value;
            } else {
                $data = $data[$val];
            }
            $result[$val] = $data[$val];
            
        }
        return $result;
}
Всё бы отлично но смущает NOTICE. Не могу понять на каком этапе в цикле ошибка.
 

sobachnik

Новичок
А Notice на какую конкретно строку указывает? И на какую переменную/ключ массива/что там ещё...
 

Beginner.83

Новичок
А Notice на какую конкретно строку указывает? И на какую переменную/ключ массива/что там ещё...
PHP:
public static function set($name, $value)
    {
       $action = 'self::$instance->data[\''.str_replace('.', '\'][\'', $name).'\'] = $value;';
       eval($action);
       self::save(var_export(self::$instance->data, 1));
    }
Вот нашёл такой выход.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Стильно, модно, молодежно.
 

Beginner.83

Новичок
Стильно, модно, молодежно.
Буду признателен за комментарии по делу. Есть ещё какой нибудь вариант вашей реализации. Потому как у меня жёсткие сомнения к правильности реализации. И больше всего меня напрягает eval().
 

fixxxer

К.О.
Партнер клуба
PHP:
function set(array &$a, $path, $value) {
    $ptr = &$a;
    foreach (explode('.', $path) as $token) {
        isset($ptr[$token]) && is_array($ptr[$token]) or $ptr[$token] = array();
        $ptr = &$ptr[$token];
    }
    $ptr = $value;
}
 
Сверху