2012-02-23 58 views
3

在另一個thread我問壓扁具有特定樣式的陣列來獲得這樣的事:反向削平陣列多維

array(4) { 
    ["one"]=> string(9) "one_value" 
    ["two-four"]=> string(10) "four_value" 
    ["two-five"]=> string(10) "five_value" 
    ["three-six-seven"]=> string(11) "seven_value" 
} 

我有一些很好的幫助那裏,但我現在不知道怎麼會我扭轉這種方法再次獲得相同的原始數組:

array(
    'one' => 'one_value', 
    'two' => array 
     (
      'four' => 'four_value', 
      'five' => 'five_value' 
     ), 

    'three' => array 
     (
      'six' => array 
       (
        'seven' => 'seven_value' 
       ) 

     ) 
) 

我用遞推法,但沒有運氣嘗試。 我感謝所有提前的幫助!

回答

2
function expand($flat) { 
    $result = array(); 
    foreach($flat as $key => $val) { 
     $keyParts = explode("-", $key); 
     $currentArray = &$result; 
     for($i=0; $i<count($keyParts)-1; $i++) { 
      if(!isSet($currentArray[$keyParts[$i]])) { 
       $currentArray[$keyParts[$i]] = array(); 
      } 
      $currentArray = &$currentArray[$keyParts[$i]]; 
     } 
     $currentArray[$keyParts[count($keyParts)-1]] = $val; 
    } 
    return $result; 
} 

請注意,上面的代碼沒有經過測試,只是爲了說明這個想法。 &運算符用於$currentArray不是存儲值,而是存儲樹中某個節點的引用(由多維數組實現),因此更改$currentArray也會更改$result

+0

雖然我不太瞭解如何(以及如何)與引用一起工作,但此函數的工作原理相當不錯,按預期工作! :) – MGP 2012-02-23 19:53:30

0

這是一種有效的遞歸解決方案:

$foo = array(
    "one" => "one_value", 
    "two-four" => "four_value", 
    "two-five" => "five_value", 
    "three-six-seven" => "seven_value" 
); 



function reverser($the_array) { 
    $temp = array(); 
    foreach ($the_array as $key => $value) { 
     if (false != strpos($key, '-')) { 
     $first = strstr($key, '-', true); 
     $rest = strstr($key, '-'); 
     if (isset($temp[$first])) { 
      $temp[$first] = array_merge($temp[$first], reverser(array(substr($rest, 1) => $value))); 
     } else { 
      $temp[$first] = reverser(array(substr($rest, 1) => $value)); 
     } 
     } else { 
     $temp[$key] = $value; 
     } 
    } 
    return $temp; 
} 

print_r(reverser($foo)); 

strstr(___, ___, true)只適用於PHP 5.3或更大,但如果這是一個問題,有一個簡單的在線解決方案(問,如果你願意的話) 。