2015-09-15 50 views
1

我有一個靜態數組屬性無法通過關鍵

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

這個問題的答案看起來像它會爲你工作:http://stackoverflow.com/questions/15483496/how-to-dynamically-set-value-in-multidimensional-array-by-reference – rodamn

回答

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

謝謝對,我應該把它作爲參考。但是如何讓這個東西適用於任何級別的數組? –

+0

你知道所有的父鍵是什麼,或者只是子鍵? –

+0

我可能不會。如果只有兩個級別的數組,那麼你的這些代碼運行良好。我希望它找到任何級別的數組的關鍵並設置它的值 –