2012-07-20 109 views
1

说我有一个代表id键和值的数组代表parent转换一个一维数组到嵌套阵的关系键

4 => 0 
2 => 0 
5 => 2 
6 => 5 
8 => 0 
9 => 0 
10 => 8 
12 => 0 
13 => 0 
14 => 0 
18 => 7 
19 => 18 
20 => 19 
21 => 20 
22 => 21 
23 => 22 
24 => 23 
28 => 20 
7 => 5 

你也可以看这是一个对象:

{ 
    id  : 4, 
    parent : 0 
    } // etc... 

多维数组我想从这个实现是:

4 => 0 
2 => 5 
     => 6 
     => 7 
      => 18 
       => 19 
         => 20 
          => 21 
           => 22 
             => 23 
              => 24 
          => 28 
8 => 10 
9 => 0 
12 => 0 
13 => 0 
14 => 0 

我该如何去做这件事?

+1

.........什么? – 2012-07-20 09:22:43

+0

似乎**图形**(在计算机科学)? – 2012-07-20 09:30:11

+0

当然闻起来像功课 – Pete 2012-07-20 09:31:59

回答

3

如果你写了一个小助手功能,以您的数据返工类似的结构:

$input = array(
    array('id' => '4', 'parent' => '0'), 
    // ... 
); 

可能喜欢的东西来实现:

$data = array_map(function ($entry) { 
    list($id, $parent) = array_map('trim', explode('=>', $entry)); 
    return array(
    'id' => $id, 
    'parent' => $parent 
); 
}, explode("\n", $data)); 

然后你可以使用函数我以类似的question使用:

function flatToNested($d, $r = 0, $p = 'parent', $k = 'id', $c = 'children') { 
    $m = array(); 
    foreach ($d as $e) { 
    isset($m[$e[$p]]) ?: $m[$e[$p]] = array(); 
    isset($m[$e[$k]]) ?: $m[$e[$k]] = array(); 
    $m[$e[$p]][] = array_merge($e, array($c => &$m[$e[$k]])); 
    } 
    return $m[$r]; 
} 

以产生嵌套数组:

$nested = flatToNested($data); 

演示:http://codepad.viper-7.com/HAZxaA

+1

如果这些值是字符串,即id =>'node-4',parent ='node-0',而不是id = 4等,那该怎么办?我怎样才能修改这个功能? – pat34515 2012-07-20 10:39:43

+0

@Patrick我不认为这应该是一个问题,只要他们是独特的'flatToNested'将正确处理它。 – Yoshi 2012-07-20 10:44:06

+0

是否可以发布整个代码,例如在[codepad.org](http://www.codepad.org) – Yoshi 2012-07-20 10:48:19