无法按键设置多维数组的值

时间:2015-09-15 21:04:56

标签: php arrays multidimensional-array

我有一个静态数组属性

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')时,它无效。如果嵌套数组更深,我也不确定如何处理它。

请帮我解决这个问题,或者我也欢迎任何好的解决方案。

由于

1 个答案:

答案 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;
    }
}