Преобразование строки в массив

O
На сайте с 23.09.2014
Offline
76
941

Как можно преобразовать строку $str = '$opt[$path[0]][$path[1]]';

в массив? То есть чтобы переменная $str содержала значение массива $opt[$path[0]][$path[1]].

Д
На сайте с 13.01.2015
Offline
3
#1

serialize или implode, подробнее на php.net

P.S.

Превед Черкаго ;).

Всегда рад помочь с вопром по python, php и wordpress =).
O
На сайте с 23.09.2014
Offline
76
#2
Дартаньяныч:
serialize или implode, подробнее на php.net
P.S.
Превед Черкаго ;).

Спасибо. Но это не совсем то что мне нужно.

Вы тоже из Черкасс?

Joker-jar
На сайте с 26.08.2010
Offline
154
#3
siv1987
На сайте с 02.04.2009
Offline
427
#4

$php = '$opt[$path[0]][$path[1]]';

$str = '$str = '.$php.';';

eval($str);

L
На сайте с 07.12.2007
Offline
351
#5
Osavul:
Как можно преобразовать строку $str = '$opt[$path[0]][$path[1]]';
в массив? То есть чтобы переменная $str содержала значение массива $opt[$path[0]][$path[1]].

Откуда в $opt[$path[0]][$path[1]] берутся значения? Иначе по eval вы просто проинициируете $str пустым массивом.

Вот так будет работать:

$tmp = '$opt[$path[0]][$path[1]]= "/path_to_file"; $str= $opt[$path[0]][$path[1]];';
eval($tmp);
echo $str;
echo '<br>';
echo $opt[$path[0]][$path[1]];

* наружные кавычки ' - одинарные неспроста!

Но $str - лишняя, не знаю зачем она вам нужна. После eval можно работать сразу с $opt[$path[0]][$path[1]]

И вообще - у вас что-то не так с идеологией проекта. Для нормальной работы с внешними данными обычно хватает serialize()/unserialize() или json_decode()/json_encode().

Смотрите, чтобы в eval пользовательский ввод не попадал - а то сайт быстро хакнут.

O
На сайте с 23.09.2014
Offline
76
#6
Ladycharm:
Откуда в $opt[$path[0]][$path[1]] берутся значения?

Есть 2 массива:

1-вый входной одномерный массив $path количество его элементов заранее не известно (может быть от $path[0] до $path[5] и более).

2-й многомерный асоц. массив $opt - структура его известная.

Нужна логика сравнения двух массивов $opt и $path, то есть например существует ли такой элемент массива как $opt[$path[0]][$path[1]] или $opt[$path[0]][$path[1]$path[2]][$path[3]] или $opt[$path[0]].

Поскольку я не знаю количество элементов на входе массива $path, я придумал код:


$n = count($path);

for($x=0; $x < $n; $x++)
{
$lis .= '[$path'.'['.$x.']'.']';
}

$lis = '$lis = $opt'.$lis.';';
eval($lis);

if($lis)
$conc = $lis;
else
$conc = 'Page404View';

return $conc;

Возможно есть более правильные решения?

totamon
На сайте с 12.05.2007
Offline
437
#7

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

Osavul:
Нужна логика сравнения двух массивов $opt и $path, то есть например существует ли такой элемент массива как $opt[$path[0]][$path[1]] или $opt[$path[0]][$path[1]$path[2]][$path[3]] или $opt[$path[0]].

не нужна вам такая логика, откуда она вобще взялась?

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
VHS
На сайте с 28.09.2007
Offline
142
VHS
#8

а нельзя сразу?


$fail = false;
$ret = $opt;
foreach($path as $v)
{
if(isset($ret[$v]))
{
$ret = $ret[$v];
} else {
$fail = true;
break;
}
}

Но логики тут конечно нет

L
На сайте с 07.12.2007
Offline
351
#9
Osavul:
Возможно есть более правильные решения?

Можно просто проверять существование элемента массива функцией isset():


if (isset($opt[$path[0]][$path[1]$path[2]][$path[3]])) {...}
if (isset($opt[$path[0]])) {...}
Так не устроит?
VHS
На сайте с 28.09.2007
Offline
142
VHS
#10

Хм... а я что выше написал?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий