Php 在数组中设置嵌套项

Php 在数组中设置嵌套项,php,arrays,eval,Php,Arrays,Eval,我的职能: function setItem(array $arr, $item, $value, $delimiter = '.') { $nodes = explode($delimiter, $item); $code = "\$arr['".join("']['", $nodes)."'] = \$value;"; eval($code); return $arr; } 使用: $data = array(); $data = setItem($data

我的职能:

function setItem(array $arr, $item, $value, $delimiter = '.') {
    $nodes = explode($delimiter, $item);
    $code = "\$arr['".join("']['", $nodes)."'] = \$value;";
    eval($code);
    return $arr;
}
使用:

$data = array();
$data = setItem($data, 'test.qwerty.sub', 'value');

有没有不使用“eval”的方法?

是的,但它涉及使用引用:

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;
}

您可以通过递归来实现:

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');