2009-10-22 35 views
1

好吧,基本上,我已经形成了一个mySQL查询返回一个数据集完全排序我的数据结构完全。如果我是来声明它,它会是这个样子:PHP>从嵌套集模型平面阵列形成一个多维数组

$arr = array(
     array('name' => 'Root', 'depth' => 0), 
     array('name' => 'Food', 'depth' => 0), 
     array('name' => 'Fruit', 'depth' => 1), 
     array('name' => 'Bannnanna', 'depth' => 2), 
     array('name' => 'Apple', 'depth' => 2), 
     array('name' => 'Bannnanna', 'depth' => 2), 
     array('name' => 'Meat', 'depth' => 1), 
     array('name' => 'Furniture', 'depth' => 0) 
     ); 

我想要什么,是这个$ ARR馈入的方法,这样我可以再得到一个多维数组回来。

例如,水果将是食物的孩子。 Bananana将是Fruit的一个孩子。 我需要每个'孩子'的钥匙是'网页'。

我上面显示的数组还可以返回其他信息,如'lft'和'rgt'。我没有设置'parentId',但如果需要的话,我可以更改我的模型,但我更愿意使用嵌套模型。

回答

4

下面的代码假定您的值的顺序和深度是正确的。请注意,它通过使用键删除重复项。

header('Content-Type: text/plain'); 

$arr = array(
    array('name' => 'Root', 'depth' => 0), 
    array('name' => 'Food', 'depth' => 0), 
    array('name' => 'Fruit', 'depth' => 1), 
    array('name' => 'Bannnanna', 'depth' => 2), 
    array('name' => 'Apple', 'depth' => 2), 
    array('name' => 'Bannnanna', 'depth' => 2), 
    array('name' => 'Meat', 'depth' => 1), 
    array('name' => 'Furniture', 'depth' => 0) 
); 

function process(&$arr, &$prev_sub = null, $cur_depth = 0) { 
    $cur_sub = array(); 
    while($line = current($arr)) { 
    if($line['depth'] < $cur_depth) { 
    return $cur_sub; 
    } elseif($line['depth'] > $cur_depth) { 
    $prev_sub = process($arr, $cur_sub, $cur_depth + 1); 
    } else { 
    $cur_sub[$line['name']] = $line['name']; 
    $prev_sub =& $cur_sub[$line['name']]; 
    next($arr); 
    } 
    } 
    return $cur_sub; 
} 

$values = process($arr); 
print_r($values); 

输出:

Array 
(
    [Root] => Root 
    [Food] => Array 
     (
      [Fruit] => Array 
       (
        [Bannnanna] => Bannnanna 
        [Apple] => Apple 
       ) 
      [Meat] => Meat 
     ) 
    [Furniture] => Furniture 
) 
+0

这正是我一直在寻找的,效果很棒!你能发布如何添加额外的领域? – dzm 2011-09-27 01:41:00

5

这样的事情也许

  $arr = array(
        array('name' => 'Root', 'depth' => 0), 
        array('name' => 'Food', 'depth' => 0), 
        array('name' => 'Fruit', 'depth' => 1), 
        array('name' => 'Bannnanna', 'depth' => 2), 
        array('name' => 'Apple', 'depth' => 2), 
        array('name' => 'Bannnanna', 'depth' => 2), 
        array('name' => 'Meat', 'depth' => 1), 
        array('name' => 'Furniture', 'depth' => 0) 
        ); 

      $p = array(array()); 
      foreach($arr as $n => $a) { 
       $d = $a['depth'] + 1; 
       $p[$d - 1]['children'][] = &$arr[$n]; 
       $p[$d] = &$arr[$n]; 
      } 

      print_r($p[0]); 
+0

请你能解释的foreach代码,我实在想不出如何参考书返回!谢谢 – 2011-05-09 21:39:35

+0

@Laykes,你有什么改变? – mattalxndr 2011-06-05 23:29:14

+0

对不起mattalexx:我甚至不记得问这个问题了。 – Layke 2011-06-07 23:02:54