反向平面阵列到多维

时间:2012-02-23 19:34:16

标签: php arrays recursion

在另一个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 个答案:

答案 0 :(得分: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也是。

答案 1 :(得分: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或更高版本,但如果这是一个问题,则有一个简单的单行解决方案(询问您是否喜欢它)。