我有一个配置树的数组:
$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
数组的操作?
答案 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;