我有一个静态数组属性
private static $config = array(
'base_url' => '',
'environment' => '',
'database' => array(
'dbdriver' => '',
'dbhost' => '',
'dbname' => '',
'dbuser' => '',
'dbpass' => ''
),
'default_controller' => ''
);
有一种静态方法可以按键设置项目的值
public static function set($key, $value)
{
if(isset(self::$config[$key]))
self::$config[$key] = $value;
else
{
foreach (self::$config as $i => $j)
{
if(!is_array($j))
continue;
foreach ($j as $k => $v)
{
if($k == $key)
{
$j[$k] = $value;
break;
}
}
}
}
}
现在这适用于base_url,环境等。但是当我在做Config::set('dbdriver', 'PDO')
时,它无效。如果嵌套数组更深,我也不确定如何处理它。
请帮我解决这个问题,或者我也欢迎任何好的解决方案。
由于
答案 0 :(得分:2)
这是因为当您进入foreach
时,您将获得值的副本。正如您所见,$j[$k] = $value;
无法更新主阵列。
您需要使用引用来确保原始数组得到更新。
// The `&` makes $j into a reference
foreach (self::$config as $i => &$j){
if(!is_array($j)){
continue;
}
// You don't actually need to use a `foreach` here
// You can just check if the key is set
if(isset($j[$key])){
// This should update the main array
$j[$key] = $value;
}
}