2013-08-04 44 views
2

我該如何讓這段代碼更高效/更動態,所以如果我需要傳遞更多的參數,它是動態的?PHP func_get_args()動態數組搜索

因爲現在在這一點上它是一個有點亂,我喜歡我的代碼是乾淨的,simpel :)

protected function getSettings() 
{ 
    $args = func_get_args(); 
    switch (func_num_args()) { 
     case 1: 
      $set = (isset($this->settings[ $args[0] ])) 
        ? $this->settings[ $args[0] ] 
        : array(); 
      break; 
     case 2: 
      $set = (isset($this->settings[ $args[0] ][ $args[1] ])) 
        ? $this->settings[ $args[0] ][ $args[1] ] 
        : array(); 
      break; 
     case 3: 
      $set = (isset($this->settings[ $args[0] ][ $args[1] ][ $args[2] ])) 
        ? $this->settings[ $args[0] ][ $args[1] ][ $args[2] ] 
        : array(); 
      break; 
     case 4: 
      $set = (isset($this->settings[ $args[0] ][ $args[1] ][ $args[2] ][ $args[3] ])) 
        ? $this->settings[ $args[0] ][ $args[1] ][ $args[2] ][ $args[3] ] 
        : array(); 
      break; 
     case 5: 
      $set = (isset($this->settings[ $args[0] ][ $args[1] ][ $args[2] ][ $args[3] ][ $args[4] ])) 
        ? $this->settings[ $args[0] ][ $args[1] ][ $args[2] ][ $args[3] ][ $args[4] ] 
        : array(); 
      break; 

     default: 
      $set = $this->settings; 
      break; 
    } 

    return $set; 
} 
+0

爲什麼你會有這麼多的嵌套設置?也許你應該重新考慮這個... –

回答

2

未經測試,但這種方法是有效的

function f() { 
    $ptr = $this->settings; 
    foreach (func_get_args() as $arg) { 
     if (!is_array($ptr) || !is_scalar($arg) || !isset($ptr[$arg])) { 
      return array(); 
     } 
     $ptr = $ptr[$arg]; 
    } 
    return $ptr; 
} 

我對於is_scalaris_array的測試將阻止您使用利用對象,其利用了ArrayAccessSplObjectStorage等。我假定你沒有。

+0

@arkascha好點 – goat

+0

@亨利克巴塞羅斯我認爲你錯了。 – goat

+0

是的,你說得對,對不起。 –