2

我的功能:

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

有没有“评估”的方法?

4

2 回答 2

3

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

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;
}
于 2013-02-10T01:49:57.370 回答
2

你可以用递归来做到这一点:

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');
于 2013-02-10T01:59:09.967 回答