2012-02-23 27 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或更大,但如果这是一个问题,有一个简单的在线解决方案(问,如果你愿意的话) 。