2012-08-16 93 views
0

可能重複:
PHP Walk through multidimensional array while preserving keysPHP轉換深陣列

我有一個深刻的陣列像這樣的:

array { 
    ["key1"] => "A" 
    ["key2"] => "B" 
    ["key3"] => array { 
       ["subkey1"] => "C" 
       ["subkey2"] => array { 
            ["subsubkey1"] => "D" 
           } 
       } 

} 

我不知道這陣有多深會得到。 現在我想將其轉換爲一個數組,看起來像這樣:

array { 
    array { 
    ["key1"] => "A" 
    ["key2"] => "B" 
    ["key3.subkey1"] => "C" 
    ["key3.subkey2.subsubkey1"] = > "D" 
} 

我會怎麼做呢?我想它需要遞歸?

+4

是的,遞歸會來處理它一*好辦法*。你有什麼嘗試,你到底在哪裏卡住? – deceze 2012-08-16 08:19:13

+0

請使用搜索,這已被問及之前回答。你可以通過遞歸或堆棧來實現。 – hakre 2012-08-16 08:24:34

+0

@hakra:所選的答案是非常不可讀的:-S看起來不像預期的那樣工作 – zerkms 2012-08-16 08:26:29

回答

2

就這麼簡單

$array = array(
    'a' => array(
     'b' => array(
      'c' => 'val' 
     ), 
     'd' => 'val2' 
    ), 
    'e' => 'val3' 
); 

var_dump(collapse($array)); 

function collapse($array) 
{ 
    $result = array(); 
    foreach ($array as $key => $val) { 
     if (is_array($val)) { 
      foreach (collapse($val) as $nested_key => $nested_val) { 
       $result[$key . '.' . $nested_key] = $nested_val; 
      } 
     } else { 
      $result[$key] = $val; 
     } 
    } 

    return $result; 
} 

http://ideone.com/ieSZ6

PS:通常我不喜歡給完整的解決方案,但在這種情況下 - 該解決方案可能是新手

2

太難寫這可以通過遞歸或使用堆棧來完成。這是使用堆棧的例子:

$separator = '.'; 
$flat = array(); 

while ($array) 
{ 
    list($key, $value) = array(key($array), array_shift($array)); 
    if (is_array($value)) 
    { 
     foreach($value as $subKey => $node) 
      $array[$key.$separator.$subKey] = $node; 
     continue; 
    } 
    $flat[$key] = $value; 
} 

然後結果是$flat,你$array數據像這樣:

Array 
(
    [key1] => A 
    [key2] => B 
    [key3.subkey1] => C 
    [key3.subkey2.subsubkey1] => D 
)