代码之家  ›  专栏  ›  技术社区  ›  Rizo

在数组中插入元素

  •  3
  • Rizo  · 技术社区  · 16 年前

    我有一个带有配置树的数组:

    $cfg = array('global' => array(
        'project'       => 'foo',
        'base_url'      => '/path/',
        'charset'       => 'utf-8',
        'timezone'      => 'Europe/Lisbon',
        'environment'   => 'development'),
        //...
    );
    

    我需要在树中插入一个元素(或者可能更改它),比如 "global:project" 和 "bar" 其中,第一个指定元素的路径,第二个指定元素的值。所以价值 'foo' 在里面 $cfg['global']['project'] 将成为 'bar' .

    以下是我需要的功能:

    function set_cfg($path, $value)
    { /* Alter $cfg with the given settings */ }
    

    所以我首先用 ':' 并有一个带有路径键的数组:

    $path = explode(':', $path)

    下一步是什么?我如何定义(递归地?)将键插入到 $cfg 数组?

    4 回复  |  直到 16 年前
        1
  •  2
  •   NikiC    16 年前
    function set_cfg($path, $value) {
        $path = explode(':', $path);
        $current = &$GLOBALS['cfg']; // variable is global, so get from $GLOBALS
        foreach ($path as $part) {
            $current = &$current[$part];
        }
        $current = $value;
    }
    

    如果您可以确保始终只有两个级别的配置,则可以使用:

    function set_cfg($path, $value) {
        list($first, $second) = explode(':', $path, 2);
        $GLOBALS['cfg'][$first][$second] = $value;
    }
    
        2
  •  2
  •   Ignacio Vazquez-Abrams    16 年前

    将数组作为引用参数添加到函数中,然后递归,传入要进一步检查的数组切片。当到达终点时,停止(并将值赋给键)。

        3
  •  1
  •   NikiC    16 年前

    这听起来可能很疯狂,但像这样:

    eval("\$cfg['".str_replace(':', "']['", $path)."'] = ".var_export($value, true).';');
    
        4
  •  0
  •   Jeff Beck    16 年前

    我将构建一个循环,在路径中的每个元素结束时分配值。

    下面的代码处理按请求进行的更新,但它还没有处理路径上的空节点(很可能发生这种情况),请确保在循环中执行检查,并根据需要创建新的数组。

    $node=$cfg;
    $i=0;
    while($i<count($path)-1)
    {
      $node = $node[$path[$i]];
      i++;
    }
    
    $node[$path[$i]]=$value;