my function:
function setItem(array $arr, $item, $value, $delimiter = '.') {
$nodes = explode($delimiter, $item);
$code = "\$arr['".join("']['", $nodes)."'] = \$value;";
eval($code);
return $arr;
}
using:
$data = array();
$data = setItem($data, 'test.qwerty.sub', 'value');
Is there way without "eval"?
Yes, but it involves using references:
function setItem(array &$arr, $path, $value, $delim = '.'){
$path = explode($delim, $path);
$root = &$arr;
// pointer to the current item
$current = &$arr;
foreach($path as $item){
$current[$item] = array();
// set pointer to the newly created array
$current = &$current[$item];
}
// reached the last path component;
// assign the value to it
$current = $value;
return $root;
}
You can do it with recursion:
function setItem($item, $value, $delimiter = '.') {
$nodes = explode($delimiter, $item, 2);
if(!isset($nodes[1]))
$data = $value;
else
$data = setItem($nodes[1], $value, $delimiter);
return array($nodes[0] => $data);
}
$data = setItem('test.qwerty.sub', 'value');