PHP, лучший способ установить значение в многомерном массиве, когда путь является динамическим? - PullRequest
2 голосов
/ 07 октября 2011

Найденное решение: Ключи динамического массива


У меня есть многомерный динамический массив, формат которого варьируется.например.

$data = array('blah1'=>array('blah2'=>array('hello'=>'world')));

У меня есть динамический путь в виде строки.

$pathway = 'blah1/blah2/hellow';

Этот путь разбит на егоради простоты:

$pathway_parts = explode('/', $pathway);

Моя проблема возникает из-за желания установить значение «привет».В настоящее время я делаю это с помощью eval, но я хочу устранить это зло отчасти из-за того, что php Suhosin затвердевает, ломая приложение, а также потому, что я не верю, что это лучший способ.

eval('$data["'.implode('"]["', $pathway_parts).'"] = $value;');

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

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Вы можете сделать это, используя ссылки для постепенного перехода к этому значению.

$data = array('blah1'=>array('blah2'=>array('hello'=>'world')));
$pathway = 'blah1/blah2/hello';
$pathway_parts = explode('/', $pathway);
$ref = &$data;

foreach ($pathway_parts as $part)
{
   // Possibly check if $ref[$part] is set before doing this.
   $ref = &$ref[$part];
}

$ref = 'value';

var_export($data);
0 голосов
/ 07 октября 2011

это не похоже на лучшую структуру, но что-то вроде этого может работать:

<code>//$data = array('blah1'=>array('blah2'=>array('hello'=>'world')));
$pathway = 'blah1/blah2/hellow';
$pathway_parts = explode('/', $pathway);
$value = 'some value';

$data = $value;
while($path = array_pop($pathway_parts)){
    $data = array($path=>$data);
}
echo '<pre>'.print_r($data,true).'
';

Кроме этого, вы можете создать строку json и использовать на ней json_decode. json_decode не выполняет код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...