2010-10-20 61 views
3

我与配置树的数组:阵列中的插入元件

$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阵列中的密钥操作?

回答

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

完美!谢谢! – Rizo 2010-10-20 18:05:07

+0

不,可能有两个以上的等级,不过谢谢,无论如何! – Rizo 2010-10-20 18:08:42

2

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

+0

-1我没有理由在这里使用递归。 PHP实现的弱引用非常适合这项任务。 – NikiC 2010-10-20 18:05:55

0

我会建立一个循环,通过路径中的每个元素,当在最后分配值。

以下代码按照请求处理更新,但如果可能发生(最有可能)它不会处理沿路径的空节点,请确保在循环中执行检查并根据需要创建新数组。

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

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

好吧,但是'$ i ++'? – Rizo 2010-10-20 18:09:44

+0

是的,好的。 – 2010-10-29 15:38:37

1

这听起来很疯狂,但这样的事情:

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

-1避免评估,如果你可以 - 在这里你绝对可以! – NikiC 2010-10-20 18:02:18

+0

我真的很喜欢它,但我不会用它! ;) – Rizo 2010-10-20 18:04:15

+0

+1创造力(虽然它创造了一些丑陋的东西) – Gordon 2010-10-20 18:15:48