PHP>从嵌套的集合模型平面数组中形成多维数组

时间:2009-10-22 12:13:17

标签: php

好的,基本上,我已经形成了一个mySQL查询,它返回一个完全按我的数据结构排序的数据集。如果我要声明它,它看起来像这样:

$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提供给一个方法,这样我就可以得到一个多维数组。

例如,Fruit将是Food的孩子。而Bananana将是Fruit的孩子。 我需要每个“孩子”的钥匙都是“页面”。

我上面展示的数组也可以返回其他信息,例如'lft'和'rgt'。我没有'parentId'设置,但如果需要我可以更改我的模型,但我更喜欢坚持使用嵌套集模型。

2 个答案:

答案 0 :(得分: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]);

答案 1 :(得分: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
 )