在数组中插入元素

时间:2010-10-20 17:32:19

标签: php arrays

我有一个配置树的数组:

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

我需要在给定字符串(例如"global:project""bar"的情况下将一个元素插入树中(或者可能更改它),其中first指定元素的路径,然后指定其值。因此'foo'中的$cfg['global']['project']值将变为'bar'

这是我需要的功能:

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

所以我首先使用':'扩展路径字符串并使用路径键的数组:

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

下一步是什么?如何定义(递归?)键插入$cfg数组的操作?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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 :(得分:1)

这可能听起来很疯狂,但是这样的话:

eval("\$cfg['".str_replace(':', "']['", $path)."'] = ".var_export($value, true).';');

答案 3 :(得分:0)

我会构建一个循环,在最后分配值时遍历路径中的每个元素。

以下代码处理按要求更新但是它还没有处理路径上的空节点(如果可能发生)(最有可能)确保在循环中进行检查并根据需要创建新数组。 / p>

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

$node[$path[$i]]=$value;