2016-05-14 123 views
2

我正在處理一個函數,該函數將一個數組作爲參數,然後使用輸入數組作爲關鍵字調用不同關聯數組的值。因此,例如,PHP:將標準數組轉換爲關聯數組鍵?

array('level_1', 'level_2', 'level_3') 

應該成爲

$variable_defined_within_function['level_1']['level_2']['level_3'] 

我有辦法做到這一點,我認爲會的工作,但感覺哈克和奇怪,我真的不希望使用eval()除非我絕對必須。

function fetch($keys) { 
    if (!is_array($keys)) { $variable = array($keys); } 
    foreach ($keys as $key) { 
    $assoc_string .= '[' . str_replace('\'' . '\\\'' . $key) . ']'; 
    } 
    $reqstring = 'if (isset($this->vars' . $assoc_string . ')) { return $this->vars' . $assoc_string . '; } else { return false; }'; 
    eval($reqstring); 
} 

這看起來不對,是嗎?我怎麼能將一個鍵列表轉換爲關聯數組?

回答

2

怎麼是這樣的:

function fetch($keys) { 
    if (!is_array($keys)) 
     $keys = array($keys); 

    $arr = $this->vars; 

    foreach($keys as $key) 
    { 
     if (!isset($arr[$key])) 
      return FALSE; 

     $arr = $arr[$key]; 
    } 

    return $arr; 
} 
+0

我再次忽略foreach'的'電源。除了你的一些格式問題,這個工作!謝謝 – Jonesy

1

請考慮此功能爲出發點:

function fetch(array $keys, array $array) { 
     $pointer = &$array; 

     foreach ($keys as $key) { 
      if (!isset($pointer[$key])) 
       break; 

      $pointer = &$pointer[$key]; 
     } 

     return $pointer; 

    } 

它會與提供$keys並返回最後一個現有鍵的值通過$array環。你可以使用它作爲基礎,並添加你的邏輯鍵不存在或什麼

0

這是解決方案,非常簡單,但是,但仍然非常混亂有時。

$arr = array('level_1', 'level_2', 'level_3'); 

function fetch(array $array){ 
    $numberOfDimensions = count($array); 

    // the value of array['level_1']['level_2']['level_3'] 
    $value = "something"; 
    for($i = $numberOfDimensions-1; $i >= 0; $i--){ 
     $value = array($array[$i] => $value); 
    } 
    return $value; 
} 

的print_r(取($ ARR));

輸出:

Array ([level_1] => Array ([level_2] => Array ([level_3] => something))) 

正如你所看到的,解決的方法很簡單,但是要明白是怎麼回事,你必須瞭解數組是如何工作的。

在討論關聯數組時,每個數組都有索引或散列,並且對於每個鍵只有一個值。該值可以是任何類型的,所以如果我們添加一個數組作爲另一個數組元素的值,則會得到二維數組。如果將2維數組添加爲另一個數組元素的值,則會獲得3維數組。通過重複該過程,您可以獲得N維數組。

該算法的工作原理是從最深的鍵(鍵數組中的最後一個元素)開始,並將一個新的關聯數組賦值給$ value變量,這是準備設置爲上面維數組值的值,直到循環的結束。

讓我們看看更改前後for循環變量$ value所做的更改。

變量$ value的初始值是「something」。 「something」是數組level_3的值,依此類推...

所以,運行

的print_r(陣列[ 'LEVEL_1'] [ 'LEVEL_2'] [ 'level_3']);

會產生

東西

這裏是$價值變量裏面全狀態視圖循環:

重點:level_3

something 
Array ([level_3] => something) 

關鍵:level_2

Array ([level_3] => something) 
Array ([level_2] => Array ([level_3] => something)) 

重點:LEVEL_1

Array ([level_2] => Array ([level_3] => something)) 
Array ([level_1] => Array ([level_2] => Array ([level_3] => something)))