EVAL: Warning: Cannot use a scalar value as an array

Ilia

Новичок
Всем привет подскажите пожалуйста.

PHP:
foreach ($elements as $element)
				{
					if (!empty($element))
					$a[] = "[$element]";
				}
				$elements = implode("", $a);
				$elements = preg_replace('/\W+\[]/', '', $elements);
				$path = $elements;
				eval('$str'.$path.' = 5;');
				print_r($str);
Переменная $elements после implode() содержит строку вида - [test][test2][test3], как вы уже наверное догадались я таким образом пытаюсь получить указатель на нужный мне элемент массива.
При таком выполнении я получаю ошибку, ту что в заголовке темы, но если к примеру $path = '[test][test2]' - задать этот код вручную, тогда eval() отрабатывает без проблем, я думаю что я перепробовал все вариации кавычек и пр. не могу найти решение.
 

AmdY

Пью пиво
Команда форума
Ilia
а зачем здесь эвал? лучше написать простенькую рекурсивную функцию, заодно от багов избавишься.
 

Ilia

Новичок
времени в общей сложности на решение задачи было потрачено валом, так что теперь уж очень хочется понять, почему не работает eval
 

AmdY

Пью пиво
Команда форума
Ilia
потому что у тебя где-то в цепочке не массив, а число или строка.
сделай
var_dump($str);
var_dump($str[test]);
.....
 

Ilia

Новичок
возвращает
Warning: Cannot use a scalar value as an array in path : eval()'d code on line 1 int(5) NULL

я 5 присваиваю => int(5).

может $elements надо проверять а не $str ?

подставляю ведь elements, var_dump($elements); возвращает string.

string(13) "[test][test2]"
 

Ilia

Новичок
что касается рекурсивной функции, я вначале собирался сделать так:

PHP:
function foo(array $keys) {
    $result = array();
    $current = &$result;
    while ($keys) {
        $key = array_shift($keys);
        $current[$key] = array();
        $current = &$current[$key];
    }
    return $result;
}
и передавать ей нужные мне для вставки параметры, но проблема в том что эта функция вызывается несколько раи и каждый раз возвращает новый массив, т.е затирает предыдущие вложенные элементы. поэтому я решил что eval применить быстрее, однако.
 

fixxxer

К.О.
Партнер клуба
eval быстрее. гыгыгы
eval - это грубо говоря
1) парсинг пхп-код на лексемы
2) компиляция лексем в байткод zend engine
3) собственно выполнение
 

Ilia

Новичок
Имелось ввиду что быстрее запустить строку как код чем разбираться с постоянно обновляющимся и затирающим предыдущие переменеые массивом, но судя по всему придется, т.к eval у меня так и не заработал.
 

Ilia

Новичок
Так в return $result; всегда новый и создается, в этом и проблема. Т.е я передаю функции одномерный массив из которого она делает ссылку многомерного типа - $result[test][test1][test2], после я к этому должен добавить еще один элемент к примеру - $result[test][test1][test2][label3] = value3;

Но функция отдает мне готовый массив и мне надо либо каким то образом вставлять в последний элемент свои значения, либо вставлять их прямо в функции которая его создает из одномерного - что удобнее, но тогда он будет всегда новым.
 

AmdY

Пью пиво
Команда форума
Ilia
я кстати, когда-то на форуме приводил подобный код, но лень искать.
 

Ilia

Новичок
Спасибо, я уже написал свою которая из 5 новых массивов делает один со вложенными на нужную глубину элементами.
 
Сверху