代码之家  ›  专栏  ›  技术社区  ›  Layke

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

php
  •  1
  • Layke  · 技术社区  · 15 年前

    好的,基本上,我已经形成了一个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输入一个方法,这样我就可以得到一个多维数组。

    例如,水果是食物的产物。香蕉是水果的孩子。 我需要每个“孩子”的钥匙是“页”。

    上面显示的数组还可以返回其他信息,如“lft”和“rgt”。我没有“parentID”集,但如果需要,我可以更改我的模型,但我更喜欢使用嵌套集模型。

    2 回复  |  直到 13 年前
        1
  •  4
  •   instanceof me    15 年前

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

     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
     )
    
        2
  •  5
  •   user187291    15 年前

    可能是这样的

                $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]);